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

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

发布时间:2018-12-12 18:13:35 所属栏目:教程 来源:孙金城
导读:一、什么是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

(编辑:核心网)

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

热点阅读