MERGE文でデータの存在を確認せずにINSERTまたUPDATEを実行する方法
SQLServerではMERGE文を使うと更新先に該当のキーのデータがあるかないかをIF文で確認したりせずに1行でINSERTもしくはUPDATE文を切り替えて実行することができます。
MERGE文でデータの存在を確認せずにINSERTまたUPDATEを実行する方法
本来、ユニークキーが設定されているテーブルに対してデーターの追加、更新を行う際は、まず該当のデータが存在するかどうかのチェック(一旦SELECT)してからINSERTかUPDATEをIF文で切り替えて実行します。
ところがMERGE文を使えばこの事前チェックなしにINSERTかUPDATEを1行で実行できるようになります。
MERGE文の使い方
以下のSQLが実際のMERGE文の使い方になります。
----------------------------------------- --コピー元とコピー先のテーブルを生成する ----------------------------------------- CREATE TABLE #moto_table ( no SMALLINT ,name VARCHAR(20) ,age SMALLINT ) CREATE TABLE #saki_table ( no SMALLINT ,name VARCHAR(20) ,age SMALLINT ) ----------------------------------------- --コピー元とコピー先のデータを生成する ----------------------------------------- INSERT INTO #moto_table VALUES( 10, 'モト・太郎さん', 30 ); INSERT INTO #moto_table VALUES( 20, 'モト・次郎さん', 35 ); INSERT INTO #saki_table VALUES( 10, 'サキ・太郎さん', 40 ); ----------------------------------------- --コピー元とコピー先のデータを参照する ----------------------------------------- SELECT no, name, age FROM #moto_table ORDER BY no SELECT no, name, age FROM #saki_table ORDER BY no ----------------------------------------- --コピー元をコピー先にコピーする ----------------------------------------- MERGE INTO #saki_table AS A USING ( SELECT no AS no ,name AS name ,age AS age FROM #moto_table ) AS B ON ( A.no = B.no ) WHEN MATCHED THEN --キーが一致した時のUPDATE文 UPDATE SET name = B.name ,age = B.age WHEN NOT MATCHED THEN --キーが一致しなかった時のINSERT文 INSERT ( no ,name ,age ) VALUES ( B.no ,B.name ,B.age ) ; ----------------------------------------- --コピー元とコピー先のデータを参照する ----------------------------------------- SELECT no, name, age FROM #moto_table ORDER BY no SELECT no, name, age FROM #saki_table ORDER BY no ----------------------------------------- --コピー元とコピー先のテーブルを削除する ----------------------------------------- DROP TABLE #moto_table DROP TABLE #saki_table
#saki_tableテーブルに#moto_tableテーブルの内容がコピーされていますね。
(削除はされません。)
まとめ
MERGE文を使えばINSERTかUPDATEを1行で実行できるようになリ、ソースコードに無駄なIF文を書く必要がなくなるので大変重宝します。
以上、「MERGE文でデータの存在を確認せずにINSERTまたUPDATEを実行する方法」でした。