17.10 - 例: ON句、UPIまたはUSIを含むMERGE - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ操作言語

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Release Date
2021年7月
Content Type
プログラミング リファレンス
Publication ID
B035-1146-171K-JPN
Language
日本語 (日本)

次のテーブル定義があるとします。

     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);