16.20 - 例: 非テンポラル テーブル データの行パーティション二重テンポラル テーブルへのマージ - Teradata Vantage NewSQL Engine

Teradata Vantage™ テンポラル テーブル サポート

prodname
Teradata Database
Teradata Vantage NewSQL Engine
vrm_release
16.20
category
プログラミング リファレンス
featnum
B035-1182-162K-JPN

テンポラル形式のMERGE文を使用すると、非テンポラル テーブルのデータをプライマリ インデックス テンポラル テーブルにマージできます。次に示す、Policy_Changesという非テンポラル テーブルがあるとします。

   CREATE TABLE Policy_Changes(
      Policy_ID INTEGER,
      Customer_ID INTEGER,
      Policy_Type CHAR(2) NOT NULL,
      Policy_Details CHAR(40)
      );

さらに、次に示すPolicyという二重テンポラル テーブルもあるとします。このテーブルは、二重テンポラル テーブルのパーティション化ガイドラインに従って行パーティション化されています。

   CREATE MULTISET TABLE Policy(
      Policy_ID INTEGER,
      Customer_ID INTEGER,
      Policy_Type CHAR(2) NOT NULL,
      Policy_Details CHAR(40),
      Validity PERIOD(DATE) AS VALIDTIME,
      Policy_Duration PERIOD(TIMESTAMP(6) WITH TIME ZONE) NOT NULL
         AS TRANSACTIONTIME
      )
   PRIMARY INDEX(Policy_ID)
   PARTITION BY
      CASE_N((END(Validity) IS NULL OR
                END(Validity) >= CURRENT_DATE AT '-12:59') AND
                END(Policy_Duration) >= CURRENT_TIMESTAMP,
             END(Validity) < CURRENT_DATE AT '-12:59' AND
                END(Policy_Duration) >= CURRENT_TIMESTAMP,
             END(Policy_Duration) < CURRENT_TIMESTAMP);

次の文は、valid-time次元でPolicy_ChangesテーブルからPolicyテーブルへのsequencedマージを実行します。このマージの適用期間は、2009年12月1日から2009年12月7日になります。

有効期間が適用期間と重なるPolicyテーブルのオープン行に一致条件が適用されます。一致条件が満たされると、sequenced更新が実行されます。一致条件が満たされない場合には、sequenced挿入が実行されます。

   SEQUENCED VALIDTIME
   MERGE INTO Policy USING (
      NONSEQUENCED VALIDTIME PERIOD (DATE'2009-12-01', DATE'2009-12-07')
      SELECT
         source.Policy_ID,
         source.Customer_ID,
         source.Policy_Type,
         source.Policy_Details,
         target.Validity AS vt,
         END(target.Policy_Duration) AS ett
      FROM Policy_Changes source LEFT OUTER JOIN Policy target
      ON source.Policy_ID = target.Policy_ID
      WHERE (vt IS NULL OR
             ((BEGIN(vt) < DATE '2009-12-07') AND
             (END(vt) > DATE '2009-12-01') AND
             (ett = TIMESTAMP '9999-12-31 23:59:59.999999'))
      )
   ) AS merge_source (
         PID,
         CID,
         PType,
         PDetails,
         j,
         k
      )
   ON (Policy_ID = merge_source.PID) AND
       END(Validity) = END(j) AND END(Policy_Duration) = k
   WHEN MATCHED THEN
      UPDATE SET Policy_Details = merge_source.PDetails
   WHEN NOT MATCHED THEN
      INSERT (
         merge_source.PID,
         merge_source.CID,
         merge_source.PType,
         merge_source.PDetails,
         PERIOD(TEMPORAL_DATE, UNTIL_CHANGED)
   );