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

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

prodname
Teradata Database
Teradata Vantage NewSQL Engine
vrm_release
16.20
category
プログラミング リファレンス
featnum
B035-1182-162K-JPN

この例では、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;