left join和left semi join的区别

--建表
create TABLE left_semi_join1(
    id int,
    name STRING
);

create TABLE left_semi_join2(
    id int,
    age STRING
);

--插入数据
INSERT INTO TABLE left_semi_join1 VALUES (1,'james'),(2,'hsl'),(3,'james'),(4,'hsl');
INSERT INTO TABLE left_semi_join2 VALUES (1,'22'),(2,'33'),(3,'44');
SELECT * from left_semi_join1;

SELECT * from left_semi_join2;

SELECT  *
FROM    left_semi_join1 a
LEFT SEMI JOIN left_semi_join2 b
ON      a.id = b.id
;

等价于:

SELECT  *
FROM    left_semi_join1 a
where a.id in (select id from left_semi_join2)
;

SELECT  *
FROM    left_semi_join1 a
LEFT JOIN left_semi_join2 b
ON      a.id = b.id
;

什么时候使用left semi join?

左表与右表的关联列都存在重复数据时,由于产生笛卡尔积,使用left join是低效的。此时采用left semi join

当左表left semi join右表时,结果表只能有左表的列,且右表只能在on中设置过滤条件,并且当右表有重复数据时,左表只会关联一次。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值