2017/12/07
ORACLEにおけるデータ登録と更新を1つのSQLで実現する際に便利なMERGE文について、本記事では解説していきます。
最新のデータで、マスタを一括して登録or更新したい場合に活用できます。
sponsored link
MERGE文の使い方と解説
基本的な使い方
基本的な使い方は以下になります。
1 2 3 4 5 6 7 8 9 10 |
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文の具体例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
-- 実行前 -- 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文について、基本的な構文と具体例を見てきました。
処理時間という面からみても優秀な場面が多いです。
使える場面では使用を検討してみましょう。
関連