加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Apache Flink 漫谈系列(11) - Temporal Table JOIN

发布时间:2018-12-12 18:12:54 所属栏目:教程 来源:孙金城
导读:一、什么是Temporal Table 在《Apache Flink 漫谈系列 - JOIN LATERAL》中提到了Temporal Table JOIN,本篇就向各人具体先容什么是Temporal Table JOIN。 在ANSI-SQL 2011 中提出了Temporal 的观念,Oracle,SQLServer,DB2等大的数据库厂商也先后实现了这
副问题[/!--empirenews.page--]

一、什么是Temporal Table

在《Apache Flink 漫谈系列 - JOIN LATERAL》中提到了Temporal Table JOIN,本篇就向各人具体先容什么是Temporal Table JOIN。

在ANSI-SQL 2011 中提出了Temporal 的观念,Oracle,SQLServer,DB2等大的数据库厂商也先后实现了这个尺度。Temporal Table记录了汗青上任何时刻点全部的数据窜改,Temporal Table的事变流程如下:

emporal Table

上图表示Temporal Table具有平凡table的特征,有详细奇异的DDL/DML/QUERY语法,时刻是其焦点属性。汗青意味着时刻,意味着快照Snapshot。

二、ANSI-SQL 2011 Temporal Table示例

我们以一个DDL和一套DML示例声名Temporal Table的道理,DDL界说PK是可选的,下面的示例我们以不界说PK的为例举办声名:

1. DDL 示例

  1. CREATE TABLE Emp 
  2. ENo INTEGER, 
  3. Sys_Start TIMESTAMP(12) GENERATED 
  4. ALWAYS AS ROW Start, 
  5. Sys_end TIMESTAMP(12) GENERATED 
  6. ALWAYS AS ROW END, 
  7. EName VARCHAR(30), 
  8. PERIOD FOR SYSTEM_TIME (Sys_Start,Sys_end) 
  9. ) WITH SYSTEM VERSIONING 

2. DML 示例

(1) INSERT

  1. INSERT INTO Emp (ENo, EName) VALUES (22217, 'Joe') 

Apache Flink 漫谈系列(11) - Temporal Table JOIN

声名: 个中Sys_Start和Sys_End是数据库体系默认添补的。

(2) UPDATE

  1. UPDATE Emp SET EName = 'Tom' WHERE ENo = 22217 

Apache Flink 漫谈系列(11) - Temporal Table JOIN

声名: 假设是在 2012-02-03 10:00:00 执行的UPDATE,执行之后上一个值"Joe"的Sys_End值由9999-12-31 23:59:59 酿成了 2012-02-03 10:00:00, 也就是下一个值"Tom"见效的开始时刻。可见我们执行的是UPDATE可是数据库内里会存在两条数据,数据值和有用期差异,也就是版本差异。

(3) DELETE (假设执行DELETE之前的表内容如下)

Apache Flink 漫谈系列(11) - Temporal Table JOIN

  1. DELETE FROM Emp WHERE ENo = 22217 

Apache Flink 漫谈系列(11) - Temporal Table JOIN

声名: 假设我们是在2012-06-01 00:00:00执行的DELETE,则Sys_End值由9999-12-31 23:59:59 酿成了 2012-06-01 00:00:00, 也就是在执行DELETE时辰没有真正的删除切合前提的行,而是体系将切合前提的行的Sys_end修改为执行DELETE的操纵时刻。标识数据的有用期到DELETE执行那一刻为止。

(4) SELECT

  1. SELECT ENo,EName,Sys_Start,Sys_End FROM Emp 
  2. FOR SYSTEM_TIME AS OF TIMESTAMP '2011-01-02 00:00:00' 

声名: 这个查询会返回全部Sys_Start <= 2011-01-02 00:00:00 而且 Sys_end > 2011-01-02 00:00:00 的记录。

三、SQLServer Temporal Table 示例

1. DDL

  1. CREATE TABLE Department 
  2. DeptID int NOT NULL PRIMARY KEY CLUSTERED 
  3. , DeptName varchar(50) NOT NULL 
  4. , ManagerID INT NULL 
  5. , ParentDeptID int NULL 
  6. , SysStartTime datetime2 GENERATED ALWAYS AS ROW Start NOT NULL 
  7. , SysEndTime datetime2 GENERATED ALWAYS AS ROW END NOT NULL 
  8. , PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime) 
  9. WITH (SYSTEM_VERSIONING = ON); 

执行上面的语句,在数据库会建设当前表和汗青表,如下图:

Apache Flink 漫谈系列(11) - Temporal Table JOIN

Department 表现是有版本节制的,汗青表是默认的名字,我也可以指命名字如:SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.DepartmentHistory)。

2. DML

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读