hive left join 丢失数据

最近在写hql取数据的时候,发现不同的写法会模糊left join 和 join,使得得出的结果不是预期的。

分别列出三段hql供参考:

1、下面是第一段hql,将相关联的两张表(or 多张表)的条件都写在最后的where下:

select a.cola1,a.cola2,b.colb1
from tablea a
left join  tableb b on a.id=b.id 
where
a.dt='20200826'
and b.dt='20200826'
;

结果:这样的写法会使得  left join 失效,得到的结果是两张表 join 的结果。主表的数据会丢失

2、下面是第二段hql,where后边只有主表的条件,其他表的条件写在了 on 的后边:

select a.cola1,a.cola2,b.colb1
from tablea a
left join  tableb b on a.id=b.id  and b.dt='20200826'
where
a.dt='20200826'
;

结果:这样的写法可以正确使用left join ,得到预期的结果。主表的数据不会丢失。

3、下面是第三段hql,使用select语句以及where得到两张需要的表,再进行left join:

select * from 
(select cola1,cola2 from tablea where dt='20200826')a
left join  
(select colb1 from tableb where dt='20200826')b 
on a.id=b.id 
;

结果:这样的写法可以正确使用 left join,得到预期的结果。主表的数据不会丢失。

结论:

第一种写法看着是left join,实际执行的是join,得到的可能不是预期的结果,需要谨慎使用。第二种和第三种写法得到的都是预期的结果。

至于为什么会这样,更深层的执行方式由于才疏学浅,暂时没有精力弄明白,还望有明白的大神赐教,欢迎评论区留言~~!

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值