leftjoinon筛选与where筛选的⽐较
join on后⾯也能进⾏条件筛选,where后⾯也能加条件进⾏筛选,但两者的结果是不⼀样的。下⾯通过实际数据案例来说明问题。
数据准备:
建表与写⼊数据
A 表
hive >create table tempTableAzw(id int,name string ,grade int ,dept int ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '|';
hive >load data local inpath '/data0/VR/' into table tempTableAzw;
<⽂件形如:
1|lijie1|100|10
2|lijie2|90|20
多表left join3|lijie3|60|10
4|lijie4|80|10
5|lijie5|70|20
B表
create table tempTableBzw(id int ,name string ) row format delimited fields terminated by "|";
load data local inpath "/data0/VR/" into table tempTableBzw;
<⽂件形如
10 IT1
20 IT2
join on 后⾯进⾏条件筛选
A表与B表进⾏left join
select A .id ,A.name ,A.grade,A.dept,B.id,B.name
from tempTableAzw A left outer join tempTableBzw B
-- 上⾯outer 其实可以省略
on A.dept =B.id ade >=80;
结果为
注意上结果图中不符合on 后⾯的条件的⾏,B的值为NULL! 如果on 后⾯不带 ade >=80 这个条件,结果为
结论: 当把过滤条件写在left join on 上⾯,会让基表所有数据都能显⽰,不满⾜的右表会以null 填充。如果将上⾯的left join 改为join 则显⽰如下。同下⾯的where 结果⼀致。
筛选⼤于80的这个条件放到where 后⾯
代码
select A .id ,A.name ,A.grade,A.dept,B.id,B.name
from tempTableAzw A left join tempTableBzw B
on A.dept =B.id
where A.grade >=80;
结果:
结论:
当把过滤条件写在where上,只会让符合筛选条件的数据显⽰。
鸣谢与参考:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论