SQL: Как ограничить количество записей, которые вставляет оператор MERGE - PullRequest
1 голос
/ 31 марта 2009

Некоторые примеры данных:

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

это печально сводит на нет ответы, данные Ианом и Догом ...

Ответы [ 2 ]

2 голосов
/ 31 марта 2009

SET ROWCOUNT не устарел, вы можете использовать верхнее предложение, если сделаете это следующим образом:

;MERGE TOP (5) @TARGET t USING 
(SELECT TOP (100) PERCENT * FROM @SOURCE ORDER BY VALUE DESC) AS s ON (t.id = s.id)
WHEN NOT MATCHED 
THEN
INSERT VALUES (s.id,s.value);

SELECT * FROM @TARGET

ORDER BY в слиянии не будет работать, если у вас нет предложения TOP, поэтому использование TOP (100) PERCENT обманывает SQL, чтобы разрешить упорядочение.

Edit:

Как насчет того, чтобы сделать это в два этапа?

;MERGE TOP (5) @TARGET t USING 
(SELECT TOP (100) PERCENT * FROM @SOURCE ORDER BY VALUE DESC) AS s ON (t.id = s.id)
WHEN NOT MATCHED 
THEN
INSERT VALUES (s.id,s.value);/*
WHEN MATCHED THEN
UPDATE SET t.value = s.value;*/

update t 
set t.Value = s.Value
from     @Target t
    join @Source s on t.ID = s.ID 
where t.Value <> s.Value

SELECT * FROM @TARGET
2 голосов
/ 31 марта 2009

Вы можете использовать SET ROWCOUNT n;

Например;

SET ROWCOUNT 4;
UPDATE Production.ProductInventory
SET Quantity = 400
WHERE Quantity < 300;

См; http://msdn.microsoft.com/en-us/library/ms188774.aspx

Или вы можете сделать

Insert to @Target 
Select top 5 s.id, s.value from @Source s 
order by s.value desc ... etc.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...