テンポラル形式の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) );