这是不关于NOT EXISTS和IN之间差异的问题。 我似乎无法让这个SQL正常工作。 逻辑似乎没问题,但我错过了一些东西。 我到处搜寻,即使在我多年的笔记中也是如此。
一个名为CompanyAccountantRef的表有3个字段。 ID,CompanyID和AccountantID。 目前在表中:
ID CompanyID AccountantID
8 6706 346388
9 6706 346256
10 6706 26263
11 363392 358951
然后这个sql没有带回正确的行:
DECLARE @CompanyID INT = 363392
DECLARE @AccountIDs TABLE (ID INT)
INSERT INTO @AccountIDs (ID) VALUES (358951)
INSERT INTO @AccountIDs (ID) VALUES (26263)
SELECT @CompanyID AS CompanyID, a.ID
FROM @AccountIDs a
WHERE NOT EXISTS(
SELECT *
FROM CompanyAccountantRef
WHERE CompanyID = @CompanyID
AND AccountantID IN (SELECT ID FROM @AccountIDs))
它应该带回来
CompanyID AccountantID
363392 26263
是的,会计师可以拥有多家公司。 我在这里错过了什么?是IN的使用打破了吗? 我尝试了几种不同的方式,包括没有运气的连接。
感谢。
答案 0 :(得分:3)
我不确定你为何感到困惑。考虑子查询:
SELECT *
FROM CompanyAccountantRef
WHERE CompanyID = @CompanyID AND
AccountantID IN (SELECT ID FROM @AccountIDs)
这会返回一行,因为CompanyAccountantRef
有一个匹配的行,其会计ID为358951
。 @AccountIds
中有一个匹配项。因此,查询返回一行。
因此,NOT EXISTS
是假的。并且不返回任何行。
我怀疑你想要某种相关的子查询。我不确定你在寻找什么逻辑。你拥有的逻辑似乎并不特别有用(它返回@AccountIds
中的所有行或者没有)。
如果我不得不猜测,你会找到类似的东西:
SELECT @CompanyID AS CompanyID, a.ID
FROM @AccountIDs a
WHERE NOT EXISTS (SELECT 1
FROM CompanyAccountantRef car
WHERE car.CompanyID = @CompanyID AND
car.AccountantID = a.ID
);
至少,这会返回您要查找的行。
答案 1 :(得分:0)
select @CompanyID, ID
from AccountIDs
except
select @CompanyID, AccountantID
from CompanyAccountantRef
where CompanyID = @CompanyID
and AccountantID in (SELECT ID FROM @AccountIDs)