写presto的时候在left join上踩过坑,总结记录一下。
内容参考知乎文章https://zhuanlan.zhihu.com/p/85856388
我们知道left join的作用是在连接的时候保留左表的记录,右表如果没有对应的行就置空。但如果遇到以下两种情况就需要注意了:
1. 左表和右表是一对多或多对多的关系时
一对多时,注意结果不是只保留一行!右表有多少行对应的结果就有多少行!
例如下面两个表,t_age表中dt=20190905的行匹配到了t_name中3行,dt=20190905的最终结果就有3行
多对多时就像做笛卡尔积(其实一对多也是笛卡尔积),比如上面那个例子中左表t_age表中有2行dt=20190906,右表t_name有两行dt=20190906,最终结果就有 2 x 2 = 4行
2. 需要对左表或右表进行过滤时
直接上结论,对左表过滤时用where,对右表过滤时用on。
如果用where对右表过滤,会导致右表匹配为空的行整行被过滤掉,这时left join的结果就和join一样了;如果用on对左表过滤,左表每一行数据依然会留着,这个on限制有和没有一样。