次の例では、ターゲット テーブルに複合プライマリ インデックスがある場合に、ON句にプライマリ インデックス(および、行パーティション テーブルの場合はパーティション列セット)に対する等価条件を指定する必要性について説明します。
次の2つのテーブルを作成するとします。
CREATE TABLE t1 ( x1 INTEGER, y1 INTEGER, z1 INTEGER) PRIMARY INDEX (x1, y1); CREATE TABLE t2 ( x2 INTEGER, y2 INTEGER, z2 INTEGER) PRIMARY INDEX(x2, y2);
次の2つのMERGEリクエストは両方とも有効です。
MERGE INTO t1 USING t2 ON x1=z2 AND y1=y2 WHEN MATCHED THEN UPDATE SET z1=10 WHEN NOT MATCHED THEN INSERT (z2,y2,x2); MERGE INTO t1 USING t2 ON x1=z2+10 AND y1=y2+20 WHEN MATCHED THEN UPDATE SET z1=10 WHEN NOT MATCHED THEN INSERT INTO (x1,y1,z1) VALUES (z2+10,y2+20,x2);
次のMERGEリクエストは、ON句に等価条件x1=z2を指定していますが、INSERT指定は、ON句の指定を複製するのではなく、y2のx1を更新するので、有効ではありません。この場合、要求元にエラーが返されます。
MERGE INTO t1 USING t2 ON x1=z2 AND y1=y2 WHEN MATCHED THEN UPDATE SET z1=10 WHEN NOT MATCHED THEN INSERT INTO (x1,y1,z1) VALUES (y2,z2,x2);
次のMERGEリクエストは、ON句に等価条件x1=z2+10を指定していますが、INSERT指定は、y2+20ではなくx1のz2+10を更新するので、有効ではありません。
MERGE INTO t1 USING t2 ON x1=z2+10 AND y1=y2+20 WHEN MATCHED THEN UPDATE SET z1=10 WHEN NOT MATCHED THEN INSERT (y2+20, z2+10, x2);