问题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


  (觉得写得不错就点个赞吧, 头条号: 风控数据开发-唔崎 欢迎关注)

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐