SQL服务器 - !NOT IN和= ANY +子查询的区别

问题描述 投票:0回答:1

我的主要目标是让公司谁了自2018年1月2日的2018年1月1日至31/01/2018(D1)过程中支付,但没什么31/01/2018(D2)的ID(翻腾)。

我解决它通过让所有的ID在D1和排除每一个的ID我在D2得到这样的。

SELECT DISTINCT 
       p.id_association
FROM dbo.paiement p
WHERE p.statut = 'OK'
      AND p.date BETWEEN '2018-01-01' AND '2018-01-31'
      AND p.id_association != ANY
(
    SELECT DISTINCT 
           p2.id_association
    FROM dbo.paiement p2
    WHERE p2.statut = 'OK'
          AND p2.date BETWEEN '2018-02-01' AND '2019-01-31'
);

但结果是WAY远远高于除外。于是我就问负责人之前,他告诉我使用NOT IN,而不是我!= ANY这给我的100倍低的结果比有例外(正常的,如果前面的查询是错误的,多年)更加贴近。

那么,什么!= ANY (subQ)背后发生VS NOT IN (subQ)

哪一个是好的,为什么?

编辑:!= ALL做的工作,但我更喜欢NOT EXISTS版本。

sql sql-server
1个回答
3
投票

我强烈建议not exists在这种情况下:

not exists (select 1
            from dbo.paiement p2
            where p2.id_association = p.id_association and
                  p2.statut = 'AUTHORIZED' and
                  p2.date between '2018-02-01' and '2019-01-31'
           )

NOT IN在所有如果子查询返回任何NULL值不返回行。

如果你使用<>那么你要<> ALL,不<> ANY。当在子查询(和其他情况下也一样)两个ID后者基本上是正确的。

© www.soinside.com 2019 - 2024. All rights reserved.