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 | 比較レコードが存在していない場合 |