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のパターンでした。
コメント