2012-03-05 148 views
3

我想编写一个MERGE语句,使用ORDER BY子句从大表中选择TOP 10行,并将其更新为列值之一。 MERGE语句允许我选择TOP 10行,但无法将ORDER BY子句放在任何位置。SQL Server MERGE语句和ORDER BY子句

MERGE TOP(10) StudentAllocation AS SA 
USING (SELECT @sub_id AS subId) AS TSA ON SA.sub_id = TSA.subId 
WHEN MATCHED THEN 
     UPDATE SET SA.exam_batch = 1); 

回答

7

您可以使用表格表达式作为MERGE的来源和目标。

WITH SA AS 
(
SELECT TOP(10) sub_id, 
       exam_batch 
FROM StudentAllocation 
ORDER BY sub_id 
) 
MERGE SA 
USING (SELECT @sub_id AS subId) AS TSA ON SA.sub_id = TSA.subId 
WHEN MATCHED THEN 
     UPDATE SET SA.exam_batch = 1; 

,虽然这可能是简单的使用

WITH SA AS 
(
SELECT TOP(10) sub_id, 
       exam_batch 
FROM StudentAllocation 
ORDER BY sub_id 
) 
UPDATE SA 
SET exam_batch = 1 
WHERE sub_id = @sub_id; 
+0

非常感谢马丁。这是一个完美的解决方案.... :) – 2012-03-05 13:00:17

+0

在这种特定的情况下,您的解决方案是正确的。有一点需要注意的是,'MERGE'上指定的'TOP'子句是在任何行被'WHEN MATCHED \ NOT MATCHED'语句中的WHERE'子句过滤掉之后执行的。如果用户在他的'WHEN MATCHED'子句中有任何额外的过滤器,'MERGE TOP(X)'总是会影响10行(除非有少于10个可能的行更新)。您的解决方案只会影响10行,减去任何在WHEN MATCHED子句中被过滤掉的行。 – 2014-01-31 14:01:37