目的
valid-time期間の一部のみの行を変更するオプションにより、valid-timeテーブルから1つ以上の既存の行を変更します。
構文
UPDATE valid_time_table [ FOR PORTION OF valid_time_period_name FROM point_in_time_1 TO point_in_time_2 ] SET set_clause_list [ WHERE search_condition ] [;]
- valid_time_table
- 行を変更するvalid-timeテーブル。
- FOR PORTION OF
- point_in_time_1とpoint_in_time_2で定義される期間内またはこれらの期間と重なるvalid-time期間を持つ変更対象の行を修飾します。
- valid_time_period_name
- valid-time派生期間列の名前。これは、「VALIDTIME」ではありません。テーブルが定義されたときに派生期間列に割り当てられた名前です。
- point_in_time_1
- point_in_time_2
- 変更の適用期間を区切ります。
- SET set_clause_list
- WHERE search_condition
- この構文およびその他の非テンポラルのキーワード、句およびDELETEのオプションの詳細については、Teradata Vantage™ - SQLデータ操作言語、B035-1146を参照してください。valid-time期間の開始または終了列構成要素をSET句に含めることはできません。
ANSI準拠
この文は、ANSI SQL:2011に準拠しています。
使用上の注意
MERGE INTO文ではFOR PORTION OF修飾子を使用できません。
ANSI Valid-Timeテーブルの行の更新の例
以下の例では、現在、将来、および履歴行の混合を含むemployee_vtという名前の次のvalid-timeテーブルに対して問合わせが実行されると仮定しています。
eid ename terms job_start job_end ---- ----- ----- ----------- ----------- 1002 Ash TA05 2003/01/01 2003/12/31 1005 Alice TW10 2004/12/01 9999/12/31 1010 Mike TW07 2015/01/01 2016/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
例: ANSI Valid-Timeテーブルでの簡単なUPDATE
テンポラル修飾のない簡単なUPDATE文は、非テンポラル テーブルのUPDATEと同じように動作し、更新対象の行を完全に更新します。
UPDATE employee_vt SET terms='TA07' WHERE ename='Ash';
SELECT * FROM employee_vt;
eid ename terms job_start job_end
---- ----- ----- ----------- -----------
1002 Ash TA07 2003/01/01 2003/12/31
1005 Alice TW10 2004/12/01 9999/12/31
1010 Mike TW07 2015/01/01 2016/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
例: 更新のPAと行のPVの部分が重なるANSI Valid-TimeテーブルでのUPDATE
テンポラル テーブルを使用して、有効期間の一部の行のみを「変更」できます。データベースは、自動的な変更を行なうために、行の追加およびvalid-time期間の調整を行ないます。データベースは、期間の境界の変更およびテーブルへの新しい行の追加を含む、行のvalid-timeの変更を自動的に処理します。
例えば、Aliceが1年間働いた後、会社がAliceの雇用期間をTW10からPW11に昇格すると仮定します。行の有効期間のその部分だけ、Aliceの行を削除すると、テーブルではAliceに次の2つの行が自動的に作成されます。
UPDATE employee_vt FOR PORTION OF job_dur FROM DATE'2005-12-01' TO DATE'9999-12-31' SET terms='PW11' WHERE ename='Alice'; SELECT * FROM employee_vt WHERE ename=’Alice’; eid ename terms job_start job_end ---- ----- ----- ----------- ----------- 1005 Alice PW11 2005/12/01 9999/12/01 1005 Alice TW10 2004/12/01 2005/12/01
ここで、テーブルにはAliceに2つの行が作成され、彼女の雇用期間がどのように変わったか、およびそれぞれの期間に彼女が働いた時間範囲が表示されます。
例: 更新のPAが行のPV内にあるANSI Valid-TimeテーブルのUPDATE
更新のPVが行のPA内にある場合、重複する間有効な行情報の部分のみが更新され、変更の前後に存在した行の部分は別の行としてテーブルに残ります。Fredが2005年に会社での自分の仕事を減らす必要があり、その間の契約期間を変更することに同意すると仮定します。
UPDATE employee_vt FOR PORTION OF job_dur FROM DATE'2005-01-01' TO DATE'2006-01-01' SET terms='TW10' WHERE ename='Fred'; SELECT * FROM employee_vt WHERE ename=’Fred’; eid ename term job_start job_end ---- ----- ----- ----------- ----------- 1004 Fred TW10 2005/01/01 2006/01/01 1004 Fred PW12 2001/05/01 2005/01/01 1004 Fred PW12 2006/01/01 9999/12/31
この場合、テーブルでUPDATEの前にはFredの行は1行で、UPDATEの後には3行になります。この3行で期間PW12で始まり、2005年に始まる1年間にTW10に変化し、2006年にPW12に戻るFredの雇用期間を追跡しています。
これは、1つのvalid-timeテーブルに対して実行された1つのvalid-time UPDATEであったため、新しい行の作成および各行のvalid-timeの調整作業はすべてデータベースによって自動的に処理されました。