некоторые примерные данные:SQL: Как ограничить количество записей оператор MERGE будет вставлять
DECLARE @TARGET TABLE (ID INT, value INT) ;
DECLARE @SOURCE TABLE (ID INT, value INT)
INSERT INTO @TARGET VALUES (1, 213)
INSERT INTO @TARGET VALUES (2, 3)
INSERT INTO @TARGET VALUES (3, 310)
INSERT INTO @TARGET VALUES (4, 43)
INSERT INTO @SOURCE VALUES (1, 134)
INSERT INTO @SOURCE VALUES (2, 34)
INSERT INTO @SOURCE VALUES (13, 310)
INSERT INTO @SOURCE VALUES (14, 43)
INSERT INTO @SOURCE VALUES (15,32)
INSERT INTO @SOURCE VALUES (16, 30)
INSERT INTO @SOURCE VALUES (17, 60)
INSERT INTO @SOURCE VALUES (18, 5)
MERGE @TARGET t USING (SELECT * FROM @SOURCE) AS s ON (t.id = s.id)
WHEN NOT MATCHED THEN
INSERT VALUES (s.id,s.value);
SELECT * FROM @TARGET
Так что я, имеющий целевую таблицу и таблицу источника. То, что я хочу сделать, состоит в том, что, когда имеется большое количество элементов not matched
, нужно вставлять только верхние элементы x с наивысшим значением.
Использование сверху на слиянии сами не будет работать, потому что ограничил бы таблицу всей исходную, я хочу сделать что-то вроде
WHEN NOT MATCHED
LIMIT(5) AND ORDER BY Value DESC --only insert the 5 non-matches with the highest value
INSERT VALUES (s.id,s.value)
---- UPDATE ----
Моего MERGE заявления также содержит КОГДА MATCHED ТОГДА заявление:
WHEN MATCHED THEN
UPDATE SET t.value = s.value
это, к сожалению, нивелирует ответы, данные Яна и собака ...
Вы правы в том, что SET ROWCOUNT устарела. В моем комментарии к Ian Quigley я написал, что мой пример упрощен и не учитывает тот факт, что у меня также есть инструкция WHEN MATCHED THEN, которая обновляет цель. Обновление должно происходить во всех согласованных записях, вставка должна только ... – Gidon
... произойти на вершине x записей с самым высоким значением. Ваш пример будет работать, если у меня не будет другого требования. – Gidon
Как сделать это в два этапа, см. Исправленный ответ. –