17.10 - 例: ターゲット テーブルの複合プライマリ インデックス - 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
日本語 (日本)

次の例では、ターゲット テーブルに複合プライマリ インデックスがある場合に、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句の指定を複製するのではなく、y2x1を更新するので、有効ではありません。この場合、要求元にエラーが返されます。

     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ではなくx1z2+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);