【问题标题】:Sub Query Not IN With Left Join Alternative?子查询不使用左连接替代方法?
【发布时间】:2017-10-13 07:45:16
【问题描述】:

我有这样的查询

SELECT  f.ACCOUNT_ID,
        f.TGL,
        p.ACCOUNT_EMAILADDRESS


     FROM distributor_kokola.forecast f
      inner join distributor_kokola.push_distributor p on p.ACCOUNT_ID = f.ACCOUNT_ID
      where f.ACCOUNT_ID NOT IN(

                 select ACCOUNT_ID
                        from distributor_kokola.forecast
                         where DATE_FORMAT(TGL, "%Y-%m") = DATE_FORMAT(CURDATE(), "%Y-%m")  
                         group by ACCOUNT_ID


    )

      group by f.ACCOUNT_ID;

那个子查询可以工作,但是速度很慢,所以我用左连接来改变它,它工作得更快

SELECT  f.ACCOUNT_ID,
        f.TGL,
        p.ACCOUNT_EMAILADDRESS


     FROM distributor_kokola.forecast f
       left  join(

                 select ACCOUNT_ID
                        from distributor_kokola.forecast
                         where DATE_FORMAT(TGL, "%Y-%m") = DATE_FORMAT(CURDATE(), "%Y-%m")  
                         group by ACCOUNT_ID


    )subb on subb.ACCOUNT_ID = f.ACCOUNT_ID

       inner join distributor_kokola.push_distributor p on p.ACCOUNT_ID = f.ACCOUNT_ID
      group by f.ACCOUNT_ID;

但是,我的问题仍然是包含错误的结果,

使用 Not IN,查询 1 选择 NOT IN 查询 2 的位置。

如何使用左连接获得 NOT IN 查询。

谁能帮帮我?

谢谢。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您必须添加一个 WHERE 子句以根据您的LEFT JOIN 的结果进行过滤。如果您添加适当的 WHERE 子句 WHERE subb.ACCOUNT_ID IS NULL,它应该会按预期工作(因为您在子查询中使用了 GROUP BY,所以没有重复行的危险):

    SELECT  f.ACCOUNT_ID,
            f.TGL,
            p.ACCOUNT_EMAILADDRESS
         FROM distributor_kokola.forecast f
           left  join(
                     select ACCOUNT_ID
                            from distributor_kokola.forecast
                             where DATE_FORMAT(TGL, "%Y-%m") = DATE_FORMAT(CURDATE(), "%Y-%m")  
                             group by ACCOUNT_ID
        )  subb on subb.ACCOUNT_ID = f.ACCOUNT_ID
           inner join distributor_kokola.push_distributor p on p.ACCOUNT_ID = f.ACCOUNT_ID
          WHERE sub.ACCOUNT_ID IS NULL
          group by f.ACCOUNT_ID;
    

    更新

    LEFT JOIN 的目标是查找forecast 表中在子查询中没有匹配行的所有行。因此,我们需要一个 WHERE 子句来删除所有匹配行的行 - WHERE sub.ACCOUNT_ID IS NULL 非常适合。

    SO 用户@quassnoi 写了一个wonderful comparison of different methods 来实现这个目标。

    【讨论】:

    • 嘿,它的工作就像一个魅力,但我还是不明白,为什么 "WHERE subb.ACCOUNT_ID IS NULL"?
    • 亲爱的@Uchsun 尝试用小桌子学习左连接,然后你会很容易
    • @Uchsun 我已经更新了我的答案并添加了一个简短的解释。希望现在更清楚了。
    • @FrankSchmitt 非常感谢,我现在明白了。
    猜你喜欢
    • 2011-10-24
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多