MERGE文、データ登録を更新を1回のSQLで実施

ORACLE
20160225-1

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文について、基本的な構文と具体例を見てきました。
処理時間という面からみても優秀な場面が多いです。
使える場面では使用を検討してみましょう。

関連


タイトルとURLをコピーしました