NOT EXISTS不返回任何行

时间:2016-04-22 16:03:19

标签: sql sql-server

这是关于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的使用打破了吗? 我尝试了几种不同的方式,包括没有运气的连接。

感谢。

2 个答案:

答案 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)