目的
system-time次元基準を使用して、SELECT問合わせの対象となるANSI valid-timeテーブルの行を決めます。
構文
FROM valid_time_table [ [FOR] VALIDTIME { AS OF point_in_time | BETWEEN point_in_time_1 AND point_in_time_2 | FROM point_in_time_1 TO point_in_time_2 | CONTAINED IN ( point_in_time_1, point_in_time_2 ) } ]
- valid_time_table
- 問合わせ対象のvalid-timeテーブル。
- AS OF
- 指定された時点を含むvalid-time期間のvalid-timeテーブルの行を修飾します。つまり、行内の情報は指定された時点で有効な現在、過去、または将来の情報になります。返される行は、問合わせで指定された時点では有効ですが、問合わせの送信時点では有効でない可能性があります。
- point_in_time
- point_in_time_1
- point_in_time_2
- 有効時間内の点を指定するか、行が返される有効時間内の期間を区切ります。
- BETWEEN ... AND
- point_in_time_1とpoint_in_time_2で定義される期間と重なる、またはこれらの期間が直後に続くvalid-time期間を持つすべての行を修飾します。これは、一般に理解されている意味での「between(間)」ではありません。BETWEENはpoint_in_time_1の時点より前に始まるvalid-time期間の行、およびpoint_in_time_2時点の直後に始まり、それを超える行を修飾するからです。一般に理解されているBETWEENの意味を反映する修飾子としては、CONTAINED IN修飾子を使用します。
- FROM ... TO
- point_in_time_1とpoint_in_time_2で定義される期間と重なるvalid-time期間を持つすべての行を修飾します。
- CONTAINED IN
- point_in_time_1とpoint_in_time_2の間のvalid-time期間を持つすべての行を修飾します。point_in_time_1以降に始まり、point_in_time_2以前に終わるvalid-time期間。CONTAINED INは、ANSIに対するTeradataの拡張機能です。
ANSI準拠
この文は、ANSI SQL:2011規格に対するTeradata拡張機能です。
ANSIでは、AS OF、BETWEEN ... AND、FROM ... TOテンポラル修飾子はvalid-timeテーブルの問合わせでサポートされていません。
使用上の注意
- FROM句でテンポラル修飾子を使用しない場合、valid-timeテーブルのデフォルトでは有効性に関係なく、テーブル内のすべての行を修飾します。
- FROM句でテンポラル修飾子を使用する場合、結果でvalid-time開始列と終了列が返されません。
- BETWEEN ... AND、FROM ...TO、およびCONTAINED INはすべて期間に従って、テンポラル テーブルの問合わせを修飾します。指定期間中(またはBETWEEN ... ANDの場合、指定期間の直後)の任意の時点で有効だった任意のテーブルの行が問合わせ用に修飾されます。3つのテンポラル修飾子の違いはわずかですが、行の正確なセットを修飾する問合わせを定義できます。
FROM句の例
valid-timeテーブルでテンポラル修飾子のない簡単なSELECTではvalid-time期間に関わらずテーブル内のすべての行が表示されます。このvalid-timeテーブルにjob_startからjob_endまでの期間を表わすvalid-time派生期間job_durがあるとします。
SELECT * FROM employee_systime; eid ename terms job_start job_end ---- ----- ----- ---------- ----------- 1002 Ash TA05 2003/01/01 2003/12/31 1005 Alice TW11 2004/12/01 2005/12/01 1010 Mike TW07 2015/01/01 2016/12/31 1005 Alice PW11 2005/12/01 9999/12/31 1001 Sania TW08 2002/01/01 2006/12/31 1004 Fred PW12 2001/05/01 9999/12/31 1003 SRK TM02 2004/02/10 2005/02/09
job_end日付が9999-12-31の行は無制限に有効です。
2005年12月1日に変更されたAliceのジョブ契約の期間を示すAliceの重複する日付のない2つの行に注意してください。1つの行は、2005年12月1日に終わり、もう1つの行が2005年12月1日に始まっているのにも関わらず、行は「重なりません」。job_start行とjob_end行から派生する真の期間は開始境界を含み、終了境界を除外するとみなされるからです。
テンポラル修飾子を使用すれば、現在、過去、将来の指定した任意の時点や期間に有効な行を修飾できます。
例: ANSI Valid-TimeテーブルでのAS OF問合わせ
次のAS OF問合わせでは、2002年1月1日に有効であったテーブルのすべての行が取得されます。
SELECT * FROM employee_vt FOR VALIDTIME AS OF DATE’2002-01-01’; eid ename terms job_start job_end ---- ----- ----- ---------- ----------- 1001 Sania TW08 2002/01/01 2006/12/31 1004 Fred PW12 2001/05/01 9999/12/31
2002年1月1日を含むvalid-time期間のジョブを持っていたのは、SaniaとFredだけです。
テンポラル問合わせでは、将来の時点に有効になる、または将来の時点でも有効な行を返す将来の時間を指定できます。
SELECT * FROM employee_vt FOR VALIDTIME AS OF DATE’2015-02-01’; eid ename terms job_start job_end ---- ----- ----- ---------- ----------- 1005 Alice PW11 2005/12/01 9999/12/31 1010 Mike TW07 2015/01/01 2016/12/31 1004 Fred PW12 2001/05/01 9999/12/31
例: ANSI Valid-TimeテーブルでのCONTAINED IN問合わせ
CONTAINED IN問合わせでは、指定された期間内にのみ有効であった行が返されます。指定された期間内に始まっても、期間を超えて継続されるvalid-time期間の行は、返されません。
SELECT * FROM employee_vt FOR VALIDTIME CONTAINED IN (DATE’2004-01-01’,DATE’2005-12-31’); eid ename terms job_start job_end ---- ----- ----- ---------- ----------- 1005 Alice TW11 2004/12/01 2005/12/01 1003 SRK TM02 2004/02/10 2005/02/09
例: ANSI valid-timeテーブルでのFROM ...TO問合わせ
この問合わせでは、CONTAINED INの例と同じ期間を指定しますが、FROM ... TO修飾子の場合、指定された期間が重なるvalid-time期間の行が返されます。
SELECT * FROM employee_vt FOR VALIDTIME FROM DATE’2004-01-01’ TO DATE’2005-12-31’; eid ename terms job_start job_end ---- ----- ----- ---------- ----------- 1005 Alice TW11 2004/12/01 2005/12/01 1004 Fred PW12 2001/05/01 9999/12/31 1005 Alice PW11 2005/12/01 9999/12/31 1003 SRK TM02 2004/02/10 2005/02/09 1001 Sania TW08 2002/01/01 2006/12/31