美文网首页
SQL语言,存在A表但是不在B表中的数据

SQL语言,存在A表但是不在B表中的数据

作者: 一颗西蓝花_ | 来源:发表于2020-06-08 20:28 被阅读0次
    背景

    客户给了3万customer list,在平台上跑预估计算特征时,需要算力太大了,调了好几次资源都不行,内存都上t了,还是不行,于是乎,将3万拆分了两个1万5,分别预估。

    问题

    本来,可以使用的语法是

    • Batch 1
    SELECT * FROM Table 
    LIMIT 15000
    
    • Batch 2
    SELECT * FROM Table
    LIMIT 15000, 15000
    

    这样就完成了两个预估批次的选择,但是开始,为了图方便,用了平台自定义的数据拆分算子,这就是血泪的开始。

    平台自定义的数据拆分算子,将随机种子设置为0,两次拆分的结果会不一致(随机种子一样了,就该一致了啊TAT)这导致的结果就是,拆出来的两个batch 不是mutual exclusive。

    但是,问题已经发生了,怎么办呢?想办法解决呗

    解法
    1. 使用上文的办法,重新拆,重新跑两次结果,但是这个有一个弊端,跑一个batch需要24小时,跑两个batch就需要48小时,时间就是金钱啊💰,哪能浪费
    2. batch1已经预测好了,可以用总的list 减去batch1中的list,就剩下的是尚未被预测的list
      思路想好了,如何代码实现呢?代码的实现有如下思路,选择在总表(t1)中出现了的cust list,但是没有在batch1(t2)中出现的cust id。代码实现如下
    SELECT  DISTINCT t1.id FROM t1
    WHERE t1.id not in (SELECT t2.id FROM t2)
    

    对吧,但是上述代码有一个问题,那就是我们的平台不支持not in,怎么办呢?思考其他解决方案。
    我们可以使用 left join

    select * from t1 left join t2 on t1.id = t2.id where t2.id is null
    

    同时,也乘此机会,再次回顾left join

    SQL LEFT JOIN 语法

    SELECT col_name
    FROM table1
    LEFT JOIN table2
    ON table1.col_name = table2.col_name
    
    • LEFT JOIN前面的数据表,就是基准,参考图如下


      image.png
    • 其实在上述代码中,当t2.id存在一些,没有值的value,因此值是null,所以返回和匹配的是这些值为null的id。但是这些id在t1中是有值的,所以最后也是会返回值。

    相关文章

      网友评论

          本文标题:SQL语言,存在A表但是不在B表中的数据

          本文链接:https://www.haomeiwen.com/subject/rhibzhtx.html