2016-04-22 62 views
0

这是不是关于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

但是在不存在的表达式将有或没有表达。它并不依赖于@AccountIDs – Paparazzi

回答

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)