例: 将来行に適用されないCurrent変更 - Teradata Database - Teradata Vantage NewSQL Engine

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

Product
Teradata Database
Teradata Vantage NewSQL Engine
Release Number
16.20
Published
2019年3月
Language
日本語
Last Update
2019-10-29
dita:mapPath
ja-JP/avd1530664741287.ditamap
dita:ditavalPath
ja-JP/avd1530664741287.ditaval
dita:id
B035-1182
Product Category
Software
Teradata Vantage

この例では、currentデータ変更が将来行には適用されないことを示しています。次のテーブルは、ある企業の従業員と部門を記述するものとします。

CREATE MULTISET TABLE employee ,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT
     (
      eid INTEGER NOT NULL,
      ename VARCHAR(50) CHARACTER SET LATIN NOT CASESPECIFIC NOT NULL,
      bdate DATE FORMAT 'yyyy/mm/dd',
      job_duration PERIOD(DATE) NOT NULL AS VALIDTIME,
      deptid INTEGER,
      mid INTEGER)

PRIMARY INDEX ( eid );

CREATE MULTISET TABLE dept ,NO FALLBACK ,
     NO BEFORE JOURNAL,
     NO AFTER JOURNAL,
     CHECKSUM = DEFAULT
     (
      deptid INTEGER NOT NULL,
      deptname VARCHAR(100) CHARACTER SET LATIN NOT CASESPECIFIC)
UNIQUE PRIMARY INDEX ( deptid );

この企業の経営者は、サポート(SUPPORT)部門の人員削減を迫られているとします。入社3か月未満の従業員は解雇しなければなりません。次の問合わせでは、就業期間が3か月未満の従業員を削除します。

CURRENT VALIDTIME
DELETE employee
FROM dept
WHERE dept.deptname = 'SUPPORT' AND
      dept.deptid = employee.deptid AND
      BEGIN(job_duration) > CURRENT_DATE - interval '3' month;

ここで、この企業でまだ働いていない新規従業員のための従業員エントリがシステムに含まれているとします。上記のDELETE文では、このような将来の従業員は削除されません。このような従業員を現在の従業員と同時に削除する場合には、次の文を使用します。

BT;
/* delete currently employees in department with less than 3 months
work*/
CURRENT VALIDTIME
DELETE employee
FROM dept
WHERE dept.deptname = 'SUPPORT' AND
      dept.deptid = employee.deptid AND
      BEGIN(job_duration) > current_date - interval '3' month;

/* delete all future employees */
SEQUENCED VALIDTIME
DELETE employee
FROM dept
WHERE dept.deptname = 'SUPPORT' AND
      dept.deptid = employee.deptid AND
      BEGIN(job_duration) > TEMPORAL_DATE;

ET;

これ以外の方法として、次のSQLでも同様の操作が実現できます。

REPLACE VIEW v1 AS
NONSEQUENCED VALIDTIME
SELECT employee.eid, dept.deptid
FROM employee, dept
WHERE dept.deptname = 'SUPPORT' AND
 dept.deptid = employee.deptid AND
BEGIN(job_duration) > CURRENT_DATE - interval '3' month
AND job_duration OVERLAPS PERIOD(TEMPORAL_DATE, UNTIL_CHANGED);
SEQUENCED VALIDTIME PERIOD(TEMPORAL_DATE, UNTIL_CHANGED)
DELETE employee FROM v1 WHERE v1.eid = employee.eid AND 
 v1.deptid = employee.deptid;