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