ORACLEにおけるデータ登録と更新を1つのSQLで実現する際に便利なMERGE文について、本記事では解説していきます。
最新のデータで、マスタを一括して登録or更新したい場合に活用できます。
MERGE文の使い方と解説
基本的な使い方
基本的な使い方は以下になります。
MERGE INTO テーブル1(登録or更新先のテーブル)
USING テーブル2(登録or更新元のテーブル)
ON(テーブル1とテーブル2の結合条件)
WHEN MATCHED THEN -- 存在レコードの更新
UPDATE SET 項目 = 値
,項目 = 値
WHEN NOT MATCHED THEN -- 存在レコードの更新
INSERT (項目,項目,項目)
VALUES (値,値,値)
;
解説
MERGE文は、DML文の1つで、元テーブルのデータが先のテーブルに存在すれば更新、存在しなければ登録を1度に行うSQLです。
DML文なので、更新を確定するためには、MERGE後にCOMMITの発行が必要です。(ROLLBACKで戻すことも可能)
あるテーブルの値で、別のテーブルのデータ登録や更新を行う場合、PL/SQL等でカーソル抽出&登録更新を行うか、EXISTSを使った副問い合わせでの一括登録や更新が必要です。
どちらにしても相応の処理になりますが、MERGE文を使用することで比較的シンプルなSQLで実現する事が出来ます。
また、同じテーブルに何度もアクセスする必要が無いため、処理時間も優秀です。
その面からも使う意味があります。
注意点
ON句で指定した項目については、更新が出来ないため注意が必要です。
MERGE文の具体例
以下、MERGE文の具体例です。
-- 実行前
-- test_table1
A B C D
--- ----- --- ---
001 00001
003 00003
-- test_table2
A B C D
--- ----- --- ---
001 00001 100 999
002 00002 200 888
MERGE INTO test_table1 t1
USING test_table2 t2
ON( t1.a = t2.a
AND t1.b = t2.b
)
WHEN MATCHED THEN
UPDATE SET c = t2.c
,d = t2.d
WHEN NOT MATCHED THEN
INSERT (a,b,c,d)
VALUES (t2.a,t2.b,t2.c,t2.d)
;
COMMIT;
-- 実行後
-- test_table1
A B C D
--- ----- --- ---
001 00001 100 999
002 00002 200 888
003 00003
まとめ
データ登録と更新を1つのSQLで実現出来るMERGE文について、基本的な構文と具体例を見てきました。
処理時間という面からみても優秀な場面が多いです。
使える場面では使用を検討してみましょう。
関連



