システム期間テンポラル表を照会すると、指定した時点または期間の結果を返すことができます。
これらの結果には、現行値とそれまでの履歴値が含まれる場合があります。
このタスクについて
システム期間テンポラル表を照会するとき、FROM 節に FOR SYSTEM_TIME を含めることができます。
FOR SYSTEM_TIME の指定を使用すると、データの現在と過去の状態を照会できます。
期間は以下のように指定します。
- AS OF value1
- 期間の開始値が value1 以下で、期間の終了値が value1 より大きいすべての行が含まれます。これを使用すると、特定の時点のデータを照会できます。
- FROM value1 TO value2
- 行において指定された期間の開始列の値が value2 より小さく、かつ、行において指定された期間の終了列の値が value1 より大きい行が、すべて含まれます。
value1 が value2 以上である場合、行は返されません。
- BETWEEN value1 AND value2
- 期間の一部が value1 と value2 の間のいずれかの時点とオーバーラップするすべての行が含まれます。
期間の開始値が value2 以下で、期間の終了値が
value1 より大きい場合、行が返されます。
サンプル照会については、以下のセクションを参照してください。
手順
システム期間テンポラル表を照会するには、SELECT ステートメントを使用します。
例えば、以下の照会はそれぞれ、システム期間テンポラル表のデータの削除のトピックの結果表にある保険証書情報を要求します。
照会ごとに異なる FOR SYSTEM_TIME 指定を使用しています。
policy_info 表とそれに関連する履歴表は、以下のとおりです。
表 1. システム期間テンポラル表: policy_infopolicy_id |
coverage |
sys_start |
sys_end |
ts_id |
A123 |
12000 |
2010-01-31- 22.31.33. 495925000000 |
9999-12-30- 00.00.00. 000000000000 |
2010-01-31- 22.31.33. 495925000000 |
C567 |
25000 |
2011-02-28- 09.10.12. 649592000000 |
9999-12-30- 00.00.00. 000000000000 |
2011-02-28- 09.10.12. 649592000000 |
表 2. 履歴表: hist_policy_infopolicy_id |
coverage |
sys_start |
sys_end |
ts_id |
C567 |
20000 |
2010-01-31- 22.31.33. 495925000000 |
2011-02-28- 09.10.12. 649592000000 |
2010-01-31- 22.31.33. 495925000000 |
B345 |
18000 |
2010-01-31- 22.31.33. 495925000000 |
2011-09-01- 12.18.22. 959254000000 |
2010-01-31- 22.31.33. 495925000000 |
- 期間指定なしの照会。 例えば、
SELECT policy_id, coverage
FROM policy_info
where policy_id = 'C567'
この照会は、1 つの行を返します。SELECT は policy_info 表のみを照会します。
FOR SYSTEM_TIME が指定されていないため、履歴表は照会されません。
C567, 25000
- FOR SYSTEM_TIME AS OF を指定した照会。 例えば、
SELECT policy_id, coverage
FROM policy_info
FOR SYSTEM_TIME AS OF
'2011-02-28-09.10.12.649592000000'
この照会は、3 つの行を返します。SELECT は、policy_info 表と hist_policy_info 表の両方を照会します。
期間の開始列は期間に含まれますが、終了列は期間に含まれません。
履歴表の sys_end 列値が 2011-02-28-22.31.33.495925000000 である行は value1 と等しいですが、それが返されるためには value1 より小さくなければなりません。
A123, 12000
C567, 25000
B345, 18000
- FOR SYSTEM_TIME FROM..TO を指定した照会。 例えば、
SELECT policy_id, coverage, sys_start, sys_end
FROM policy_info
FOR SYSTEM_TIME FROM
'0001-01-01-00.00.00.000000' TO '9999-12-30-00.00.00.000000000000'
where policy_id = 'C567'
この照会は、2 つの行を返します。SELECT は、policy_info 表と hist_policy_info 表の両方を照会します。
C567, 25000, 2011-02-28-09.10.12.649592000000, 9999-12-30-00.00.00.000000000000
C567, 20000, 2010-01-31-22.31.33.495925000000, 2011-02-28-09.10.12.649592000000
- FOR SYSTEM_TIME BETWEEN..AND を指定した照会。 例えば、
SELECT policy_id, coverage
FROM policy_info
FOR SYSTEM_TIME BETWEEN
'2011-02-28-09.10.12.649592000000' AND '9999-12-30-00.00.00.000000000000'
この照会は、3 つの行を返します。SELECT は、policy_info 表と hist_policy_info 表の両方を照会します。
sys_start 列値が 2011-02-28-09.10.12.649592000000 である行は value1 と等しいので返されます。期間の開始時刻は期間に含まれるためです。
sys_end 列値が 2011-02-28-09.10.12.649592000000 である行は value1 と等しいので返されません。期間の終了時刻は期間に含まれないためです。
A123, 12000
C567, 25000
B345, 18000
その他の例
このセクションでは、システム期間テンポラル表の他の照会例を示します。
- 他の有効な日付値またはタイム・スタンプ値を使用する照会
- policy_info 表が作成され、その時刻関連の列は TIMESTAMP(12) として宣言されているため、他の有効な日付値またはタイム・スタンプ値を使用する照会は、TIMESTAMP(12) を使用するように変換されてから実行されます。
例えば、
SELECT policy_id, coverage
FROM policy_info
FOR SYSTEM_TIME AS OF '2011-02-28'
これは、以下のように変換されて実行されます。
SELECT policy_id, coverage
FROM policy_info
FOR SYSTEM_TIME AS OF '2011-02-28-00.00.00.000000000000'
- ビューの照会
- あたかもシステム期間テンポラル表であるかのように、ビューを照会できます。
ビュー参照の後に FOR SYSTEM_TIME 指定を指定できます。
CREATE VIEW policy_2011(policy, start_date)
AS SELECT policy_id, sys_start FROM policy_info;
SELECT * FROM policy_2011 FOR SYSTEM_TIME BETWEEN
'2011-01-01-00.00.00.000000' AND '2011-12-31-23.59.59.999999999999';
ビュー policy_2011 に対する SELECT は、policy_info 表と hist_policy_info 表の両方を照会します。
返されるのは、2011 年のいずれかの時点でアクティブであったすべての保険証書です。これには保険証書が開始された日付が含まれます。
A123, 2010-01-31-22.31.33.495925000000
C567, 2011-02-28-09.10.12.649592000000
C567, 2010-01-31-22.31.33.495925000000
B345, 2010-01-31-22.31.33.495925000000
ビュー定義に期間指定が含まれる場合は、ビューに対する照会に期間指定を含めることはできません。
以下のステートメントは、期間指定が複数あるためにエラーを返します。
CREATE VIEW all_policies AS SELECT * FROM policy_info;
FOR SYSTEM_TIME AS OF '2011-02-28-09.10.12.649592000000';
SELECT * FROM all_policies FOR SYSTEM_TIME BETWEEN
'2011-01-01-00.00.00.000000' AND '2011-12-31-23.59.59.999999999999';