Apache Flink 漫谈系列 - JOIN LATERAL

作者:媒体转发 时间:2018-11-29 21:21

字号

上一篇《Apache Flink 漫谈系列 - JOIN算子》我们对最常见的JOIN做了详尽的分析,本篇介绍一个特殊的JOIN,那就是JOIN LATERAL。JOIN LATERAL为什么特殊呢,直观说因为JOIN的右边不是一个实际的物理表,而是一个VIEW或者Table-valued Funciton。本篇会先介绍传统数据库对LATERAL JOIN的支持,然后介绍Apache Flink目前对LATERAL JOIN的支持情况。

Apache Flink 漫谈系列 - JOIN LATERAL

二、实际问题

假设我们有两张表,一张是Customers表(消费者id, 所在城市), 一张是Orders表(订单id,消费者id),两张表的DDL(SQL Server)如下:

Customers

CREATE TABLE Customers ( 

customerid char(5) NOT NULL, 

city varchar (10) NOT NULL 

 

insert into Customers values('C001','Beijing'); 

insert into Customers values('C002','Beijing'); 

insert into Customers values('C003','Beijing'); 

insert into Customers values('C004','HangZhou'); 

查看数据:

Apache Flink 漫谈系列 - JOIN LATERAL

Orders

CREATE TABLE Orders( 

orderid char(5) NOT NULL, 

customerid char(5) NULL 

 

insert into Orders values('O001','C001'); 

insert into Orders values('O002','C001'); 

insert into Orders values('O003','C003'); 

insert into Orders values('O004','C001'); 

查看数据:

Apache Flink 漫谈系列 - JOIN LATERAL

1. 问题示例

假设我们想查询所有Customers的客户ID,地点和订单信息,我们想得到的信息是:

Apache Flink 漫谈系列 - JOIN LATERAL

(1) 用INNER JOIN解决

如果大家查阅了《Apache Flink 漫谈系列 - JOIN算子》,我想看到这样的查询需求会想到INNER JOIN来解决,SQL如下:

SELECT 

c.customerid, c.city, o.orderid 

FROM Customers c JOIN Orders o 

    ON o.customerid = c.customerid 

查询结果如下:

Apache Flink 漫谈系列 - JOIN LATERAL

但如果我们真的用上面的方式来解决,就不会有本篇要介绍的内容了,所以我们换一种写法。

2. 用 Correlated subquery解决

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

WHERE Clause

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

SELECT 

c.customerid, c.city 

FROM Customers c WHERE c.customerid IN ( 

SELECT 

o.customerid, o.orderid 

FROM Orders o 

WHERE o.customerid = c.customerid 

执行情况:

Apache Flink 漫谈系列 - JOIN LATERAL

上面的问题是用在WHERE Clause里面subquery的查询列必须和需要比较的列对应,否则我们无法对o.orderid进行投影, 上面查询我为什么要加一个o.orderid呢,因为查询需求是需要o.orderid的,去掉o.orderid查询能成功,但是拿到的结果并不是我们想要的,如下:

SELECT 

c.customerid, c.city 

FROM Customers c WHERE c.customerid IN ( 

SELECT 

o.customerid 

FROM Orders o 

WHERE o.customerid = c.customerid 

查询结果:

Apache Flink 漫谈系列 - JOIN LATERAL

可见上面查询结果缺少了o.orderid,不能满足我们的查询需求。

FROM Clause

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

SELECT 

c.customerid, c.city, o.orderid 

FROM Customers c, ( 

SELECT 

o.orderid, o.customerid 

FROM Orders o 

WHERE o.customerid = c.customerid 

) as o 

我们会得到如下错误:

Apache Flink 漫谈系列 - JOIN LATERAL

责任编辑:CQITer新闻报料:400-888-8888   本站原创,未经授权不得转载
关键词 >>Apache Flink JOIN 代码
继续阅读
热新闻
推荐
关于我们联系我们免责声明隐私政策 友情链接