MERGE文を使用して、単一のSQLリクエスト内で更新操作と挿入操作を実行することができます。MERGEでは、更新操作と挿入操作を個別に実行しなければならない事例とは異なり、1つのパスでインデックスと参照整合性の保守を実行できます。
例えば、次のテーブルを作成し、MERGEリクエストを使用してソース テーブルt2からターゲット テーブルt1への行の更新と挿入を実行するとします。
USING (empno INTEGER, CREATE TABLE t1 ( a1 INTEGER, b1 INTEGER, c1 INTEGER); CREATE TABLE t2 ( a2 INTEGER, b2 INTEGER, c2 INTEGER); MERGE INTO t1 USING t2 ON a1=a2 WHEN MATCHED THEN UPDATE SET b1=b2 WHEN NOT MATCHED THEN INSERT (a2, b2, c2);
EXPLAINは、条件("OB.t1.a1 = OB.t2.a2")でのOB.t2からOB.t1への一致更新および不一致挿入によるマージを示します。
このMERGEリクエストは、次の意味的に同じ複文のUPDATE INSERTリクエストとしても記述できます。
UPDATE t1 FROM t2 SET b1=b2 WHERE a1=a2 ;INSERT INTO t1 SELECT a2, b2, c2 FROM t2, t1 WHERE NOT (a1=a2);
2つのEXPLAINレポートを比較すると、MERGEリクエストのほうが意味的に同じUPDATEとINSERTの複文リクエストよりも優れていることがわかります。
UPDATEとINSERTの複文リクエストでは、以下のステップが並列して実行されます。
- OB.t2からOB.t1へのMERGE更新
- OB.t2からのRETRIEVEステップ
次に、結合条件("OB.t1.a1 <> a2")によるOB.t1への結果のJOINステップがあります。