17.05 - 例: ON句の条件は、プライマリ インデックスとパーティション列の等価制約とAND付けされなければならない - 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
日本語 (日本)

次の例では、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;