Некоторые примеры данных:
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 верхнего значения с самым высоким значением.
Использование top в самом слиянии не сработает, потому что это ограничит всю исходную таблицу, я хочу сделать что-то вроде
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)
---- ОБНОВЛЕНИЕ ----
Мое утверждение MERGE также содержит утверждение WHEN MATCHED THEN:
WHEN MATCHED THEN
UPDATE SET t.value = s.value
это печально сводит на нет ответы, данные Ианом и Догом ...