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

Apache Flink 漫谈系列(10) - JOIN LATERAL

发布时间:2018-12-11 20:59:57 所属栏目:教程 来源:孙金城
导读:一、聊什么 上一篇《Apache Flink 漫谈系列 - JOIN算子》我们对最常见的JOIN做了细致的说明,本篇先容一个非凡的JOIN,那就是JOIN LATERAL。JOIN LATERAL为什么非凡呢,直观说由于JOIN的右边不是一个现实的物理表,而是一个VIEW可能Table-valued Funciton
副问题[/!--empirenews.page--]

一、聊什么

上一篇《Apache Flink 漫谈系列 - JOIN算子》我们对最常见的JOIN做了细致的说明,本篇先容一个非凡的JOIN,那就是JOIN LATERAL。JOIN LATERAL为什么非凡呢,直观说由于JOIN的右边不是一个现实的物理表,而是一个VIEW可能Table-valued Funciton。本篇会先先容传统数据库对LATERAL JOIN的支持,然后先容Apache Flink今朝对LATERAL JOIN的支持环境。

Apache Flink 漫谈系列(10) - JOIN LATERAL

二、现实题目

假设我们有两张表,一张是Customers表(斲丧者id, 地址都市), 一张是Orders表(订单id,斲丧者id),两张表的DDL(SQL Server)如下:

  • Customers
  1. CREATE TABLE Customers ( 
  2. customerid char(5) NOT NULL, 
  3. city varchar (10) NOT NULL 
  4.  
  5. insert into Customers values('C001','Beijing'); 
  6. insert into Customers values('C002','Beijing'); 
  7. insert into Customers values('C003','Beijing'); 
  8. insert into Customers values('C004','HangZhou'); 

查察数据:

Apache Flink 漫谈系列(10) - JOIN LATERAL

  • Orders
  1. CREATE TABLE Orders( 
  2. orderid char(5) NOT NULL, 
  3. customerid char(5) NULL 
  4.  
  5. insert into Orders values('O001','C001'); 
  6. insert into Orders values('O002','C001'); 
  7. insert into Orders values('O003','C003'); 
  8. insert into Orders values('O004','C001'); 

查察数据:

Apache Flink 漫谈系列(10) - JOIN LATERAL

1. 题目示例

假设我们想查询全部Customers的客户ID,所在和订单信息,我们想获得的信息是:

Apache Flink 漫谈系列(10) - JOIN LATERAL

(1) 用INNER JOIN办理

假如各人查阅了《Apache Flink 漫谈系列 - JOIN算子》,我想看到这样的查询需求会想到INNER JOIN来办理,SQL如下:

  1. SELECT 
  2. c.customerid, c.city, o.orderid 
  3. FROM Customers c JOIN Orders o 
  4.     ON o.customerid = c.customerid 

查询功效如下:

Apache Flink 漫谈系列(10) - JOIN LATERAL

但假如我们真的用上面的方法来办理,就不会有本篇要先容的内容了,以是我们换一种写法。

2. 用 Correlated subquery办理

Correlated subquery 是在subquery中行使关联表的字段,subquery可以在FROM Clause中也可以在WHERE Clause中。

  • WHERE Clause

用WHERE Clause实现上面的查询需求,SQL如下:

  1. SELECT 
  2. c.customerid, c.city 
  3. FROM Customers c WHERE c.customerid IN ( 
  4. SELECT 
  5. o.customerid, o.orderid 
  6. FROM Orders o 
  7. WHERE o.customerid = c.customerid 

执行环境:

Apache Flink 漫谈系列(10) - JOIN LATERAL

上面的题目是用在WHERE Clause内里subquery的查询列必需和必要较量的列对应,不然我们无法对o.orderid举办投影, 上面查询我为什么要加一个o.orderid呢,由于查询需求是必要o.orderid的,去掉o.orderid查询能乐成,可是拿到的功效并不是我们想要的,如下:

  1. SELECT 
  2. c.customerid, c.city 
  3. FROM Customers c WHERE c.customerid IN ( 
  4. SELECT 
  5. o.customerid 
  6. FROM Orders o 
  7. WHERE o.customerid = c.customerid 

查询功效:

Apache Flink 漫谈系列(10) - JOIN LATERAL

可见上面查询功效穷乏了o.orderid,不能满意我们的查询需求。

  • FROM Clause

(编辑:湖南网)

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

热点阅读