维表JOIN语句

简介:

维表

维表是一张不断变化的表(不更新的表是变化表的一种特例)。
如何查询或JOIN一张不断变化的表? 如果用传统的JOIN语法来表达JOIN dim_table ON xxx,会导致多次运行得到的结果不一致。所以在查询或JOIN维表的时候,需要明确指名要查看的是维表的哪个时刻的快照。因此,需要引入 SQL:2011 的Temporal Table语义。

维表DDL

Flink SQL中没有专门为维表设计的DDL语法,使用标准的 CREATE TABLE 语法即可,同时需额外增加一行PERIOD FOR SYSTEM_TIME的声明。这行声明定义了维表的变化周期,即表明该表是一张会变化的表。

维表DDL示例

 
  
  1. CREATE TABLE white_list (
  2. id varchar,
  3. name varchar,
  4. age int,
  5. PRIMARY KEY (id), -- 用作维表的话,必须有声明的主键
  6. PERIOD FOR SYSTEM_TIME
  7. ) with (
  8. type = 'xxx',
  9. ...
  10. )

维表具体声明方式和参数请参见维表创建

注意:声明一个维表时,必须指明主键。维表JOIN时,ON的条件必须包含所有主键的等值条件。

维表JOIN

维表是一张不断变化的表,因此在JOIN维表的时候,需指明这条记录关联维表哪个时刻的快照。目前仅支持关联当前时刻的维表(未来会支持关联左表rowtime所对应的维表快照)。

维表JOIN语法

 
  
  1. SELECT column-names
  2. FROM table1 [AS <alias1>]
  3. [LEFT] JOIN table2 FOR SYSTEM_TIME AS OF PROCTIME() [AS <alias2>]
  4. ON table1.column-name1 = table2.key-name1
  • 维表支持INNER JOINLEFT JOIN,不支持RIGHT JOINFULL JOIN
  • JOIN维表时,在维表后必须加上FOR SYSTEM_TIME AS OF PROCTIME()

    说明:FOR SYSTEM_TIME AS OF PROCTIME()含义是:JOIN维表当前时刻所看到的每条数据。

  • 维表JOIN工作模式是左表的一条记录到达时,在维表中查询并关联上匹配的数据。如果维表插入了一条数据能匹配上之前左表的数据时,JOIN的结果流不会发出更新的数据以弥补之前的未匹配。

  • JOIN行为只发生在处理时间(processing time),即使维表中的数据都被删了,之前JOIN流已经发出的关联上的数据也不会被撤回或改变。

例如,事件流JOIN白名单维表的SQL如下。

 
  
  1. SELECT e.*, w.*
  2. FROM event AS e
  3. JOIN white_list FOR SYSTEM_TIME AS OF PROCTIME() AS w
  4. ON e.id = w.id

注意:

  1. 维表JOIN的ON条件中一定要有包括维表primary key的等值条件,因为需要根据key来查维表。ON条件中可以有其他条件,例如 ON event.id = white_list.id AND event.name = white_list.name,其他条件需要包含所有维表主键的等值条件。
  2. 维表和维表不能做JOIN。DDL声明的字段、主键等需要和真实表里面定义的一致。

维表示例

测试数据

nameinfo:

id(bigint) name(VARCHAR) age(bigint)
1 lilei 22
2 hanmeimei 20
3 libai 28

phoneNumber:

name(VARCHAR) phoneNumber(bigint)
dufu 18867889855
baijuyi 18867889856
libai 18867889857
lilei 18867889858

测试语句

 
  
  1. CREATE TABLE datahub_input1 (
  2. id BIGINT,
  3. name VARCHAR,
  4. age BIGINT
  5. ) WITH (
  6. type='datahub'
  7. );
  8. create table phoneNumber(
  9. name VARCHAR,
  10. phoneNumber bigint,
  11. primary key(name),
  12. PERIOD FOR SYSTEM_TIME
  13. )with(
  14. type='rds'
  15. );
  16. CREATE table result_infor(
  17. id bigint,
  18. phoneNumber bigint,
  19. name VARCHAR
  20. )with(
  21. type='rds'
  22. );
  23. INSERT INTO result_infor
  24. SELECT
  25. t.id
  26. ,w.phoneNumber
  27. ,t.name
  28. FROM datahub_input1 as t
  29. JOIN phoneNumber FOR SYSTEM_TIME AS OF PROCTIME() as w
  30. ON t.name = w.name;

测试结果

id(bigint) phoneNumber(bigint) name(varchar)
1 18867889858 lilei
3 18867889857 libai
本文转自实时计算—— 维表JOIN语句
相关文章
|
6月前
T-sql 高级查询( 5*函数 联接 分组 子查询)
T-sql 高级查询( 5*函数 联接 分组 子查询)
|
SQL
SQL语句多个表查询,inner join的用法
SQL语句多个表查询,inner join的用法
247 0
|
6月前
|
SQL 数据库
SQL JOIN 子句:合并多个表中相关行的完整指南
SQL LEFT JOIN关键字返回左表(table1)中的所有记录以及右表(table2)中的匹配记录。如果没有匹配,则右侧的结果为0条记录。
321 0
JOIN多表关联查询
JOIN多表关联查询
54 0
数据查询语句:包括SELECT语句、WHERE子句、GROUP BY子句、HAVING子句、ORDER BY子句等,用于从数据表中检索数据。
数据查询语句:包括SELECT语句、WHERE子句、GROUP BY子句、HAVING子句、ORDER BY子句等,用于从数据表中检索数据。
53 1
|
SQL HIVE
hive:条件查询、join关联查询、分组聚合、子查询
hive:条件查询、join关联查询、分组聚合、子查询
721 0
hive:条件查询、join关联查询、分组聚合、子查询
|
SQL C++ Python
SQL高级查询技巧(两次JOIN同一个表,自包含JOIN,不等JOIN)
掌握了这些,就比较高级啦 Using the Same Table Twice 如下面查询中的branch字段 SELECT a.account_id, e.emp_id, b_a.name open_branch, b_e.
4644 0
|
SQL
SQL在INNER JOIN时,也可以将子查询加入进来
这个语法有点神奇,记下。 但觉得用处有限吧。 mysql> SELECT a.account_id, a_cust_id, a.open_date, a.product_cd -> FROM account AS a INNER JOIN -> (SELECT emp_...
2289 0
|
SQL Java 数据库连接
JPA的多表复杂查询
JPA的多表复杂查询
285 0