すべてのMERGE文で、ON句の照合条件に、ターゲット テーブルのプライマリ インデックスに対する等号制約を指定する必要があります。(プライマリ インデックスを持たないテーブルと列パーティション テーブルでは、MERGEはサポートされていないことに注意してください。)ターゲット テーブルが行パーティション化されていると、向上した最適化が得られるANSI MERGEパスを対象とするには、単一のパーティションが対象となるように、パーティション列も等号条件に含める必要があります。ANSI MERGE最適化パスについての詳細は、<Teradata Vantage™ SQLデータ操作言語、B035-1146>を参照してください。
テンポラル テーブルに推奨されるパーティション式ではテンポラル列の期間のEND境界のみを使用するため、照合条件でも同様に等号制約でEND条件が使用できます。END (valid_time_column) IS UNTIL_CHANGEDおよびEND (transaction_time_column) IS UNTIL_CLOSEDは、推奨されるパーティション式を使用するテンポラル テーブルのテンポラル列に等号制約として使用できます(テンポラル テーブルのパーティション式を参照)。
ターゲット行のvalid-timeの終了境界値が、前もって判明していることはほとんどありません。解決策は、USING句に同じ条件を使用してソース テーブルとターゲット テーブルを事前結合することです。これにより、ターゲット テーブルのvalid-time値を特定します。
事前結合には、NONSEQUENCED VALIDTIME修飾子を(適用できる場合には、AND CURRENT TRANSACTIONTIMEも)使用する必要があります。事前結合はソースからの左外部結合にして、一致しない行セットがターゲット テーブルに挿入されることを防止する必要があります。
例: 行パーティション化されたvalid-timeテーブルへのマージ
次の例では、マージに非テンポラルのソース テーブルを使用します。挿入される値は、あらゆる値になり得ますが、別々のパーティションに移動することになります。
CREATE MULTISET TABLE bi_tgt_tbl ( pkey_field INTEGER, int2_field INTEGER, vtcol PERIOD(DATE) NOT NULL AS VALIDTIME, ttcol PERIOD(TIMESTAMP(6) WITH TIME ZONE) NOT NULL AS TRANSACTIONTIME) PRIMARY INDEX ( pkey_field ) PARTITION BY CASE_N( ((END(vtcol)) >= DATE ) AND ((END(ttcol)) >= CURRENT_TIMESTAMP(6)), ((END(vtcol)) < DATE ) AND ((END(ttcol)) >= CURRENT_TIMESTAMP(6)), (END(ttcol )) < CURRENT_TIMESTAMP(6)); CREATE SET TABLE src_tbl ( pkey_field INTEGER, int2_field INTEGER) PRIMARY INDEX ( pkey_field ); SEQUENCED VALIDTIME MERGE INTO bi_Tgt_tbl USING /* This block prejoins and determines the target valid time values */ ( NONSEQUENCED VALIDTIME PERIOD (DATE'2009-12-15', DATE'2009-12-18') AND CURRENT TRANSACTIONTIME SELECT s.pkey_field, s.int2_field, END(b_t.vtcol) vtend, END(b_t.ttcol) ttend FROM src_tbl s LEFT OUTER JOIN bi_tgt_tbl b_t ON s.pkey_field = b_t.pkey_field ) AS nonbi_srct ( pkey, int2, vtend, ttend) ON (pkey_field = nonbi_srct.pkey) AND END(vtcol) = vtend AND END(ttcol) = ttend WHEN MATCHED THEN UPDATE SET int2_field = nonbi_srct.int2 WHEN NOT MATCHED THEN INSERT ( nonbi_srct.pkey, nonbi_srct.int2, PERIOD(TEMPORAL_DATE, UNTIL_CHANGED ) );