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