例: ANSI二重テンポラル テーブルの行の更新 - Advanced SQL Engine - Teradata Database

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

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Published
2021年7月
Language
日本語
Last Update
2021-09-23
dita:mapPath
ja-JP/kit1592007446534.ditamap
dita:ditavalPath
ja-JP/wrg1590696035526.ditaval
dita:id
B035-1186
Product Category
Software
Teradata Vantage

ここに示す例では、次のANSI二重テンポラル テーブルを使用します。

 eid ename deptno terms   job_start     job_end                         sys_start                           sys_end
---- ----- ------ -----  ----------  ----------  --------------------------------  --------------------------------
1002 Ash      333  TA05  2003/01/01  2003/12/31  2003-12-01 12:11:00.000000-08:00  9999-12-31 23:59:59.999999+00:00
1005 Alice    222  TW10  2004/12/01  9999/12/31  2004-12-01 12:00:00.450000-08:00  9999-12-31 23:59:59.999999+00:00
1010 Mike     444  TW07  2015/01/01  2016/12/31  2004-12-01 00:12:23.120000-08:00  9999-12-31 23:59:59.999999+00:00
1001 Sania    111  TW08  2002/01/01  2006/12/31  2002-01-01 00:00:00.000000-08:00  2002-07-01 12:00:00.350000+00:00
1004 Fred     222  PW12  2001/05/01  9999/12/31  2001-05-01 12:00:00.350000-08:00  9999-12-31 23:59:59.999999+00:00
1003 SRK      111  TM02  2004/02/10  2005/02/10  2004-02-10 00:00:00.000000-08:00  2004-12-01 00:12:23.120000+00:00

ANSI二重テンポラル テーブルで「削除」または「更新」ができるのは、システム時間内にまだオープンしている行のみです。これらの行を表示するには、単純なSELECTを発行します。

SELECT * FROM employee_bitemp;

 eid ename deptno terms   job_start     job_end                         sys_start                           sys_end
---- ----- ------ -----  ----------  ----------  --------------------------------  --------------------------------
1002 Ash      333  TA05  2003/01/01  2003/12/31  2003-12-01 12:11:00.000000-08:00  9999-12-31 23:59:59.999999+00:00
1005 Alice    222  TW10  2004/12/01  9999/12/31  2004-12-01 12:00:00.450000-08:00  9999-12-31 23:59:59.999999+00:00
1010 Mike     444  TW07  2015/01/01  2016/12/31  2004-12-01 00:12:23.120000-08:00  9999-12-31 23:59:59.999999+00:00
1004 Fred     222  PW12  2001/05/01  9999/12/31  2001-05-01 12:00:00.350000-08:00  9999-12-31 23:59:59.999999+00:00

有効時間の一部の期間で行が更新されている場合は更新し、2つの行が作成されます。

UPDATE employee_bitemp 
FOR PORTION OF job_dur FROM DATE'2005-01-01' TO DATE'9999-12-31' 
SET terms='PW11' 
WHERE ename='Alice';

単純なSELECTを実行すると、以前は1行存在していたAliceの行が今では2行あることがわかります。これは、2005年に雇用契約の条件が変更されたためです。

 eid ename deptno terms   job_start     job_end                         sys_start                           sys_end
---- ----- ------ -----  ----------  ----------  --------------------------------  --------------------------------
1002 Ash      333  TA05  2003/01/01  2003/12/31  2003-12-01 12:11:00.000000-08:00  9999-12-31 23:59:59.999999+00:00
1005 Alice    222  PW11  2005/01/01  9999/12/31  2014-02-26 00:45:48.450000-08:00  9999-12-31 23:59:59.999999+00:00
1010 Mike     444  TW07  2015/01/01  2016/12/31  2004-12-01 00:12:23.120000-08:00  9999-12-31 23:59:59.999999+00:00
1005 Alice    222  TW10  2004/12/01  2005/01/01  2014-02-26 00:45:48.450000-08:00  9999-12-31 23:59:59.999999+00:00
1004 Fred     222  PW12  2001/05/01  9999/12/31  2001-05-01 12:00:00.350000-08:00  9999-12-31 23:59:59.999999+00:00

Aliceの行は明示的に削除されず、更新のみ行なわれたため、両方の行はまだシステム時間内にオープンしています。契約変更前のAliceの情報が含まれている行は、有効時間内では履歴行であるとみなされます。古いTW10契約が廃止されたときに、valid-timeの終了境界に変更のPAの開始が反映されました。新しいPW11契約が設定された新しいAlice行には、Aliceの現在の契約が反映されています。新しい契約が有効になったときに、valid-timeの開始境界に変更のPAの開始が反映されました。

ただし、行が変更されていて、テーブルにすべての変更を追跡するためのsystem-time次元が含まれているため、Aliceの元の行、つまり元のvalid-timeの開始値と終了値を含む行はシステム時間内にクローズ行(論理的に削除された行)としてテーブルに残っています。system-timeでテンポラル問合わせを使用して、テーブル内のすべてのオープン行とクローズ行を表示すると、このことを確認できます。

SELECT * FROM employee_bitemp 
FOR SYSTEM_TIME BETWEEN TIMESTAMP'1900-01-01 22:14:02.820000-08:00' AND CURRENT_TIMESTAMP;

 eid ename deptno terms   job_start     job_end                         sys_start                           sys_end
---- ----- ------ -----  ----------  ----------  --------------------------------  --------------------------------
1002 Ash      333  TA05  2003/01/01  2003/12/31  2003-12-01 12:11:00.000000-08:00  9999-12-31 23:59:59.999999+00:00
1005 Alice    222  PW11  2005/12/01  9999/12/31  2014-02-26 00:45:48.450000-08:00  9999-12-31 23:59:59.999999+00:00
1010 Mike     444  TW07  2015/01/01  2016/12/31  2004-12-01 00:12:23.120000-08:00  9999-12-31 23:59:59.999999+00:00
1005 Alice    222  PW11  2004/12/01  2005/01/31  2014-02-26 00:45:48.450000-08:00  9999-12-31 23:59:59.999999+00:00
1004 Fred     222  PW12  2001/05/01  9999/12/31  2001-05-01 12:00:00.350000-08:00  9999-12-31 23:59:59.999999+00:00
1005 Alice    222  TW10  2004/12/01  9999/12/31  2004-12-01 12:00:00.450000-08:00  2014-02-26 00:45:48.450000-08:00
1003 SRK      111  TM02  2004/02/10  2005/02/10  2004-02-10 00:00:00.000000-08:00  2004-12-01 00:12:23.120000+00:00
1001 Sania    111  TW08  2002/01/01  2006/12/31  2002-01-01 00:00:00.000000-08:00  2002-07-01 12:00:00.350000+00:00

有効時間については、元の行が単に変更され、新しい契約を記録する新しい行が追加されました。元の行のvalid-timeの終了値が変更され、新しい行のvalid-timeの開始値に、新しい行の条件が有効になった日時が反映されています。

システム時間については、元のvalid-time期間が含まれている元の行がテーブルから削除されました。システム時間と有効時間は独立した次元であるため、元の行のvalid-time期間の終了値を変更すると、単純な行変更が起こり、それによって元の行がシステム時間内にクローズし、テーブルから論理的に削除されます。そのため、有効時間内に元の行の変更によって作成された新しい2つのAlice行の他に、元の行自体もクローズして、3番目のAlice行を構成しています。この3番目の行はシステム時間内にクローズし、変更前の行の永続的な記録として残ります。

システム時間の場合、valid-time期間の開始境界列と終了境界列は通常のデータ列です。そのため、これらのいずれかの値が変更されても、変更前に存続していた元の行はシステム時間内にクローズ行としてマークされますが、テーブルに保持されます。