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