佐々木屋

技術的なことから趣味まで色々書きます

MERGE文で高速に条件によってINSERT、UPDATE、DELETEを行う

INSERTかUPDATEかをSELECTしないで操作する方法を前回説明しました。
sasaki816.hatenablog.com

この方法だと、単純なテーブルによる更新処理であれば問題ありませんが、検索対象がより複雑なテーブルになると走査が多くなり低速になってしまいます。

SQLServer2008よりMERGE文が導入され、これらの問題が解消されました。複雑なテーブルであっても高速で更新・新規・削除を行うことができます。

MERGE INTO 対象テーブル AS A USING (比較テーブル) AS  B
ON(A.支店CD = B.支店CD AND A.日付 = B.日付)
WHEN MATCHED THEN UPDATE SET A.売上 = B.売上,A.数量 = B.数量
WHEN NOT MATCHED THEN INSERT (支店CD,日付,売上,数量) 
VALUES (B.支店CD,B.日付,B.売上,B.数量);

なお、SQL文の最後にSQL文を連続で記述する場合に付ける「;」が単体でも必要となります。


条件は以下の3通り指定できます。

構文 内容
WHEN MATCHED THEN 比較条件と一致しているレコード
WHEN NOT MATCHED THEN
WHEN NOT MATCHED BY TARGET THEN
対象レコードが存在しない場合
WHEN NOT MATCHED BY SOURCE THEN 比較レコードが存在していない場合