hive的连接文档鼓励使用隐式连接,即。
SELECT *
FROM table1 t1, table2 t2, table3 t3
WHERE t1.id = t2.id AND t2.id = t3.id AND t1.zipcode = '02535';
这等于
SELECT t1.*, t2.*, t3.*
FROM table1 t1
INNER JOIN table2 t2 ON
t1.id = t2.id
INNER JOIN table3 t3 ON
t2.id = t3.id
WHERE t1.zipcode = '02535'
,或以上是否会返回其他记录?
1条答案
按热度按时间pnwntuvh1#
不总是这样。您的查询是等效的。但是没有
WHERE t1.id = t2.id AND t2.id = t3.id
会的CROSS JOIN
.更新:
这是一个有趣的问题,我决定添加一些演示。让我们创建两个表:
A(c1 int, c2 string)
以及B(c1 int, c2 string)
.加载数据:
检查数据:
检查交叉连接(隐式连接,不带
where
转化为交叉):检查内部联接(隐式联接)
where
作为内部工作):尝试通过添加
OR b.c1 is null
到以下位置:如你所见,我们又有了内部连接。
or b.c1 is null
被忽略现在
left join
没有where
以及ON
子句(转换为交叉):正如你所看到的,我们又生气了。
尝试左连接
where
从句和从句ON
(用作内部):我们有内部连接
尝试左连接
where
从句和从句ON
+尝试允许空值:又一次进入内心。或者
b.c1 is null
被忽略。左连接
on
条款:是的,这是真的左连接。
左连接
on
+where
(内心深处):我们得到了inner,因为where不允许空值。
带where+的左连接允许空值:
是的,它是左连接。
结论:
隐式连接用作innner(with where)或cross if(如果没有where子句)。
如果没有on和where,左连接可以作为cross,如果where子句不允许右表为null,左连接也可以作为inner。
最好使用ansi语法,因为它是自我解释的,而且很容易理解您希望它的工作方式。隐式连接或左连接作为内部连接或交叉连接很难理解,并且很容易出错。