SQL Server-NOT IN和!= ANY +子查询之间的区别

时间:2019-02-04 14:56:28

标签: sql sql-server

我的主要目标是获取在01/01/2018至31/01/2018(D1)期间付款的公司的ID,但从2018年1月2日至31/01/2018(D2)之后没有付款的公司的ID (客户流失)。

我通过获取D1中的所有ID并排除了我像这样在D2中获得的每个ID来解决此问题。

__construct

但是结果远远超出了例外。因此,我问过那个负责人,他告诉我使用 NOT IN 而不是我的!= ANY ,这使我比其他人的结果低100倍(如果以前的查询错误了很多年,则为正常。

那么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' ); VS != ANY (subQ)后面会发生什么?

哪个是好人,为什么?

编辑:NOT IN (subQ)可以完成工作,但我更喜欢!= ALL版本。

1 个答案:

答案 0 :(得分: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(以及其他情况)时,后者基本上是正确的。