17.05 - 例: ターゲット リレーションにパーティション プライマリ インデックスがある場合、ON句に行パーティション列セットを指定 - Advanced SQL Engine - Teradata Database

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

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

以下のテーブル定義があるとします(t1はa1にプライマリ インデックスを持ち、列b1でパーティション化されている)。

     CREATE TABLE t1 (
       a1 INTEGER,
       b1 INTEGER,
       c1 INTEGER)
     PRIMARY INDEX (a1)
     PARTITION BY b1;
     CREATE TABLE t2 (
       a2 INTEGER,
       b2 INTEGER,
       c2 INTEGER)
     PRIMARY INDEX (a2);

次のMERGEリクエストは、ON句にターゲット テーブルb1のパーティション列t1を指定しているので、有効です。

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

次のMERGEリクエストは、ON句にターゲット テーブルのパーティション列b1を指定していないので、アボートされ、要求元にエラー メッセージが返されます。

     MERGE INTO t1
       USING t2
       ON a1=a2
     WHEN MATCHED THEN
       UPDATE SET c1=c2
     WHEN NOT MATCHED THEN
       INSERT (a2, b2, c2);

次のMERGEリクエストは、INSERT指定でのb2c2の順序が、ON句の指定順序と異なるため、アボートされ、要求元にエラー メッセージが返されます。INSERT指定は、ターゲット テーブルのプライマリ インデックス、およびターゲット テーブルが行パーティション テーブルの場合は、パーティション列セットに対するON句の制約に一致する必要があります。

     MERGE INTO t1
       USING t2
       ON a1=a2 AND b1=b2
     WHEN MATCHED THEN
       UPDATE SET c1=c2
     WHEN NOT MATCHED THEN
       INSERT (a2, c2, b2);

ターゲット テーブルが行パーティション テーブルの場合、パーティション列の値もsearch_conditionに指定し、INSERT句にsearch_conditionと同じパーティション列の値を指定する必要があります。