#大数据SQL技巧#通过另一张表作为名单过滤数据的方法
通过另一张表作为名单过滤数据的方法,SQL过滤数据妙用
·
问题1:假设有一张订单表A,和一张商户表B,表B是圈定的商户列表,目标从表A过滤出表B中存在的商户的订单交易数据。
假设A、B表通过seller_id进行关联,那么写一条where seller_id in 语句(SQL1)就能完成目的。也可以使用LEFT SEMI JOIN 来实现这种场景(SQL2)。但是当A表和B表需要通过多个字段关联才决定过滤条件时,那么这种情况只能使用SEMI JOIN语法了。
INNER JOIN 也能保证两边都匹配的时候才保留数据,为什么不能使用?因为如果B表中seller_id重复的话会导致JOIN后A表的数据也重复出现。
SQL1:
select * from A where A.seller_id in (
select seller_id from B
)
SQL2:
select * from A left semi join B on A.seller_id = B.seller_id
问题2:假设有一张订单表A,和一张商户表B,表B是需要排除的商户列表,目标是从表A去除表B中商户的订单交易数据。
假设A、B表通过seller_id进行关联,那么写一条where seller_id not in语句(SQL 3)就能完成目的。但是如果B表中存在seller_id为NULL的记录,那么not in null表达式为NULL导致where语句不成立,最终获取结果为空,需要对表B的seller_id额外做非空筛选来处理。可以通过 anti join来避免这个问题(SQL 4),同样的如果需要多个字段关联确定去除条件,那么也只能使用anti join来实现了。
SQL3:
select * from A where A.seller_id not in (
select seller_id from B
)
SQL4:
select * from A left anti join B on A.seller_id = B.seller_id
(觉得写得不错就点个赞吧, 头条号: 风控数据开发-唔崎 欢迎关注)
更多推荐
所有评论(0)