Pages

2013/08/07

[SQL Server] 同じ行に対して UPDATE または DELETE が複数回試行されました。

MERGE ステートメントで、同じ行に対して UPDATE または DELETE が複数回試行されました。これは、対象の行が基になる複数の行と一致する場合に発生します。MERGE ステートメントでは対象のテーブルの同じ行で複数回 UPDATE/DELETE を実行することはできません。対象の行と一致する基になる行が 1 つだけになるように ON 句を修正するか、GROUP BY 句を使用して基になる行をグループ化してください。

ややわかりづらいエラーメッセージ。
更新元レコードが複数あり、抽出条件を追加するか、グループ化することで一対になるようにしろということらしい。

TEST1

TEST2

このようなテーブルがあった際に、以下の MERGE 文を発行するとエラーとなる。
MERGE
 TEST1
USING
 TEST2
ON (TEST1.KEY1 = TEST2.KEY1)
WHEN MATCHED THEN
 UPDATE SET TEST1.SCORE = TEST2.SCORE
WHEN NOT MATCHED THEN
 INSERT (KEY1, NAME, SCORE) VALUES (KEY1, NAME, SCORE);
TEST2 テーブルのスコアを合算してマージする場合、以下のようにグループ化する。
MERGE
 TEST1
USING
 (
  SELECT
   KEY1
   ,NAME
   ,SUM(SCORE) AS SCORE
  FROM
   TEST2
  GROUP BY
   KEY1
   ,NAME 
 ) AS TEST2
ON (TEST1.KEY1 = TEST2.KEY1)
WHEN MATCHED THEN
 UPDATE SET TEST1.SCORE = TEST2.SCORE
WHEN NOT MATCHED THEN
 INSERT (KEY1, NAME, SCORE) VALUES (KEY1, NAME, SCORE);

結果は以下の通りになる。

TEST1

Related Posts Plugin for WordPress, Blogger...