2012-03-05 10 views
3

ORDER BY句を使用して大きなテーブルからTOP 10行を選択し、列値の1つを更新するMERGEステートメントを作成したいとします。 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

どうもありがとうマーティンを使用する方が簡単かもしれませんが。これは完璧なソリューションでした.... :) –

+0

この特定のシナリオでは、ソリューションは正しいです。ただし、 'MERGE'で指定された' TOP'節は 'WHEN MATCHED \ NOT MATCHED'文の中の追加の' WHERE'節によってフィルタされた*後に*実行されます。ユーザーが 'WHEN MATCHED'節に追加のフィルターを持っていた場合、' MERGE TOP(X) 'は常に10行に影響します(更新可能な行が10未満でない限り)。あなたの解は 'WHEN MATCHED'節で除外されたものを除いた10行にのみ影響します。 –