OracleのMERGE(INSERT/UPDATEを同時に実行するSQL)

OracleのMERGE(マージ)

OralceでデータがあればUPDATEを、なければINSERTするには「MERGE」を使います。

--テーブルへ値を登録する
MERGE INTO {テーブル1}
 USING {テーブル2}
 ON {結合条件}
WHEN MATCHED THEN
 {Update文}
WHEN NOT MATCHED THEN
 {INSERT文}
;

データがなければ追加してくれるし、データがあれば更新してくれる便利なSQLが「MERGE」です。

例1. テーブル結合してMERGEするパターン

--テーブルを結合してMERGEする
MERGE INTO emp e
 USING emp_temp t
 ON e.empno = t.empno
WHEN MATCHED THEN
 --UPDATE(テーブル名は記述しない)
 UPDATE SET
  e.emp_name = t.emp_name
  e.depno = t.depno
WHEN NOT MATCHED THEN
 --INSERT(テーブル名は記述しない) 
 INSERT (e.emp_no, e.emp_name, e.depno)
  VALUES (t.emp_no, t.emp_name, t.depno);

ここでは「emp_temp」テーブルから「emp」テーブルへMERGEしました。結合条件は「empno」が一致するレコードです。「emp」テーブルにデータがあればUPDATEが実行され、なければINSERTが実行されます。

注意点として、UPDATE・INSERTに通常記述するテーブル名は記述しないという点です。

例2. 指定した値をMERGEするパターン

--指定した値でMERGEする
MERGE INTO emp e
 USING (SELECT 'A001' emp_no,'山田太郎' emp_name,'X1G' depno FROM DUAL) t
 ON e.empno = t.empno
WHEN MATCHED THEN
 UPDATE SET
  e.emp_name = t.emp_name
  e.depno = t.depno
WHEN NOT MATCHED THEN
 INSERT (e.emp_no, e.emp_name, e.depno)
  VALUES (t.emp_no, t.emp_name, t.depno);

ここではテーブルではなく値をMERGEします。登録・更新する値が決まっている場合はこちらです。「empno=A001」があれば、「emp_name=山田太郎」「depno=X1G」に更新、なければ登録します。

「USING」のあとにテーブル名ではなく、「SELECT 値 FROM DUAL」とします。SELECTでダミー表としてDUALを使って値を並べれば、MERGEの結合条件として使用できます。SELECTの値は別名をつけておきます。

以上、OracleのMERGEのパターンでした。

コメント