Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 不存在,不返回任何行_Sql_Sql Server - Fatal编程技术网

Sql 不存在,不返回任何行

Sql 不存在,不返回任何行,sql,sql-server,Sql,Sql Server,这是一个关于not EXISTS和IN之间区别的问题。 我似乎无法让这个sql正常工作。 逻辑似乎不错,但我遗漏了一些东西。 我到处都找遍了,甚至在我年复一年的笔记中 一个名为companyaccountref的表有3个字段。ID、CompanyID和AccountAnti。 目前在表中: ID CompanyID AccountantID 8 6706 346388 9 6706 346256 10

这是一个关于not EXISTS和IN之间区别的问题。 我似乎无法让这个sql正常工作。 逻辑似乎不错,但我遗漏了一些东西。 我到处都找遍了,甚至在我年复一年的笔记中

一个名为companyaccountref的表有3个字段。ID、CompanyID和AccountAnti。 目前在表中:

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来打破它吗? 我尝试过几种不同的方法,包括没有运气的连接


谢谢。

我不知道你为什么感到困惑。考虑子查询:

SELECT *
FROM CompanyAccountantRef
WHERE CompanyID = @CompanyID AND 
      AccountantID IN (SELECT ID FROM @AccountIDs)
这将返回一行,因为
CompanyAccountantRef
有一个匹配行,其会计id为
358951
@AccountIds
中存在匹配项。因此,查询返回一行

因此,
不存在
为假。并且不返回任何行

我怀疑您需要某种相关子查询。我不确定你在寻找什么逻辑。您拥有的逻辑似乎并不特别有用(要么返回
@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
                 );

至少,这会返回您要查找的行。

我不知道您为什么感到困惑。考虑子查询:

SELECT *
FROM CompanyAccountantRef
WHERE CompanyID = @CompanyID AND 
      AccountantID IN (SELECT ID FROM @AccountIDs)
select @CompanyID, ID 
  from AccountIDs  
except 
select @CompanyID, AccountantID    
  from CompanyAccountantRef 
 where CompanyID = @CompanyID 
   and AccountantID in (SELECT ID FROM @AccountIDs)
这将返回一行,因为
CompanyAccountantRef
有一个匹配行,其会计id为
358951
@AccountIds
中存在匹配项。因此,查询返回一行

因此,
不存在
为假。并且不返回任何行

我怀疑您需要某种相关子查询。我不确定你在寻找什么逻辑。您拥有的逻辑似乎并不特别有用(要么返回
@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
                 );

至少,这会返回您要查找的行。

但not exists中的表达式将包含and表达式或not表达式。它与@AccountIDs没有关联,在notexists中的表达式将具有和表达式或不具有。它与@AccountIDs aThat worked没有关联。我不想使用光标(它们是邪恶的)。谢谢成功了。我不想使用光标(它们是邪恶的)。谢谢
select @CompanyID, ID 
  from AccountIDs  
except 
select @CompanyID, AccountantID    
  from CompanyAccountantRef 
 where CompanyID = @CompanyID 
   and AccountantID in (SELECT ID FROM @AccountIDs)