次のテーブル定義があるとします。
CREATE TABLE t1 ( x1 INTEGER, y1 INTEGER, z1 INTEGER) PRIMARY INDEX (x1) PARTITION BY y1; CREATE TABLE t2 ( x2 INTEGER, y2 INTEGER, z2 INTEGER) PRIMARY INDEX (x2) UNIQUE INDEX (y2);
値リストを指定しているか、UPIまたはUSI制約を使用した単一テーブルのsubqueryによってソース リレーションが作成されるので、ソース リレーションが単一行であることが保証され、ON句にターゲット テーブルのプライマリ インデックスに対する等価条件を定数として指定している場合、INSERT指定はON句に指定した定数値に一致しても、一致しなくてもかまいません。次の2つのリクエストに示すように、どちらの指定も有効です。
次のMERGEリクエストは、INSERT指定に指定されたプライマリ インデックスの値がON句のプライマリ インデックスの指定に一致していませんが、有効です。
MERGE INTO t1 USING (SELECT * FROM t2 WHERE y2=10) AS s ON x1=10 WHEN MATCHED THEN UPDATE SET z1=z2 WHEN NOT MATCHED THEN INSERT (x2, y2, z2);
次のMERGEリクエストは、INSERT指定に指定されたプライマリ インデックスの値がON句のプライマリ インデックスの指定に一致しているので、有効です。
MERGE INTO t1 USING (SELECT x2, y2, z2 FROM t2 WHERE y2=10) AS s ON x1=10 AND y1=z2 WHEN MATCHED THEN UPDATE SET z1=10 WHEN NOT MATCHED THEN INSERT (10, z2, x2);
値リストを指定しているか、UPIまたはUSI制約を使用した単一テーブルのサブクエリーによってソース リレーションが作成されるので、ソース リレーションが単一行であることが保証され、ON句にターゲット テーブルのプライマリ インデックスに対する等価条件(定数ない)がある場合、INSERT句のプライマリ インデックスの指定は、ON句に指定したターゲット テーブルのプライマリ インデックスの値に一致する必要があります。UPDATE指定では、ターゲット テーブルのプライマリ インデックスを更新できません。
次のMERGEリクエストは、INSERT指定に指定されたプライマリ インデックスの値y2がON句に指定されたプライマリ インデックスの値に一致し、UPDATE指定はt1のプライマリ インデックスを更新しないので、有効です。
MERGE INTO t1 USING (SELECT x2, y2, z2 FROM t2 WHERE y2=10) AS s ON x1=y2 AND y1=z2 WHEN MATCHED THEN UPDATE SET z1=10 WHEN NOT MATCHED THEN INSERT (y2, z2, x2);
次のMERGEリクエストは、ソース リレーションが単一行であることが保証されないので、失敗します。単一行を保証できないのは、z2がUPIでもUSIでもないので、INSERT指定はON句の指定に一致する必要がありますが、一致していないためです。
MERGE INTO t1 USING (SELECT x2, y2, z2 FROM t2 WHERE z2=10) AS s ON x1=10 AND y1=20 WHEN MATCHED THEN UPDATE SET z1=10 WHEN NOT MATCHED THEN INSERT (y2, z2, x2);