我的主要目标是获取在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
版本。
答案 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(以及其他情况)时,后者基本上是正确的。