次の例では、MERGEリクエストのON句条件の適切な指定と不適切な指定を示しています。
次の2つのテーブル定義について考えてみましょう。以下の例では、t1がターゲット リレーションで、t2がソース リレーションとして使用されます。
CREATE TABLE t1 ( a1 INTEGER, b1 INTEGER, c1 INTEGER) PRIMARY INDEX (a1); CREATE TABLE t2 ( a2 INTEGER, b2 INTEGER, c2 INTEGER) PRIMARY INDEX (a2);
次の例は、プライマリ インデックスの等価制約a1=a2がリクエストの他の指定条件b1=b2とAND付けされているので正しい例です。
MERGE INTO t1 USING t2 ON a1=a2 AND b1=b2 WHEN MATCHED THEN UPDATE SET c1=c2 WHEN NOT MATCHED THEN INSERT (a2, b2, c2);
次の例は、プライマリ インデックスの等価制約a1=a2がリクエストの他の指定条件c1+c2=1 OR b1+b2=1とAND付けされているので正しい例です。
セカンダリ条件は内部で論理和で結ばれていますが、この条件の評価結果は、プライマリ インデックスの条件とAND付けされます。
MERGE INTO t1 USING t2 ON a1=a2 AND (c1+c2=1 OR b1+b2=1) WHEN MATCHED THEN UPDATE SET c1=c2;
次の例は有効ではありません。プライマリ インデックスの等価制約a1=a2がリクエストの他の指定条件c1=c2とOR付けされているので、このリクエストはアボートされ、要求元にエラー メッセージが返されます。
プライマリ インデックスの等価制約、およびターゲット テーブルにパーティション プライマリ インデックスがある場合はパーティション列の等価制約も、ON句に指定する他の条件とAND付けする必要があります。
MERGE INTO t1 USING t2 ON a1=a2 OR b1=b2 WHEN MATCHED THEN UPDATE SET c1=c2;