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,得到的可能不是预期的结果,需要谨慎使用。第二种和第三种写法得到的都是预期的结果。

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

### Hive SQL Left Join 使用方法及实例 在Hive查询语言(HiveQL)中,`LEFT JOIN`用于返回左中的所有记录以及右中存在的匹配记录。如果右中不存在匹配,则结果集中相应的列包含NULL。 #### 基本语法结构 ```sql SELECT column_names FROM table1 t1 LEFT JOIN table2 t2 ON t1.common_column = t2.common_column; ``` 此操作会保留来自`t1`(左侧)的所有行,即使这些行在`t2`(右侧)里找不到对应的键值配对[^2]。 #### 实际应用案例分析 考虑两个:一个是用户信息(`user`);另一个是页面浏览记录(`page_view`)。假设想要获取特定日期访问过网站的所有用户的完整资料,即便某些用户当天并未产生任何浏览行为也应被列出: ```sql INSERT OVERWRITE TABLE pv_users SELECT u.* FROM user u LEFT SEMI JOIN page_view pv ON (pv.userid = u.id) WHERE pv.date = '2008-03-03'; ``` 上述命令通过`LEFT SEMI JOIN`实现了这一需求,它只选取那些能在右边找到对应关系的左边条目,并且过滤条件应用于连接后的数据集上。 对于更常规的情况——即不仅限于存在关联数据项——则可以直接采用普通的`LEFT JOIN`: ```sql SELECT a.s_id, a.s_name, COUNT(b.c_id), SUM(CASE WHEN b.s_score IS NULL THEN 0 ELSE b.s_score END) FROM student AS a LEFT JOIN score AS b ON a.s_id = b.s_id GROUP BY a.s_id, a.s_name; ``` 这段SQL展示了如何统计每位学生所修课程量及其总分情况,即便是未参与评分的学生也会显示出来,其分默认计为零[^4]。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值