我的主要目标是让公司谁了自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
版本。
我强烈建议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后者基本上是正确的。