为什么<>运算符失败并返回所有记录?



在过去的 1 个小时里,我一直在这个查询上拔头发,结果是

select ac.* from [finance].[Accounts] ac
inner join finance.AccountMapping ap
on ap.Account_ID <> ac.AccountID

在账户表中,我们有一个账户 ID 1,2,3,4,5,6 在帐户映射表中,我们有一个account_ID 1,2

但上面的查询仍然返回 1,2 的记录。为什么?我已经提到了返回不匹配的记录。

因为ac中的每个记录可能至少有一个值不匹配的ap记录。 您可能打算:

select ac.*
from finance.Accounts ac left join
finance.AccountMapping ap
on ap.Account_ID = ac.AccountID
where ap.Account_ID is null;

或者,这可能更直接一些:

select ac.*
from finance.Accounts ac
where not exists (select 1
from finance.AccountMapping ap
where ap.Account_ID = ac.AccountID
);

您正在寻找可以使用以下方法实现的结果:

Select AccountID from AccountMapping
Except
Select AccountID from Accounts 

您误解了内部连接的ON子句的工作方式:对于第一个表的每条记录,它将找到连接表中满足条件的所有记录。只要您在外部到主键上执行等联接,您最多可以获得一条记录。一旦切换到<>><等,您可能会得到第一个表的每条记录的多个联接记录。

在您的示例中,您要查找 ID 不匹配的所有行。这是存在量词的完美案例,即EXISTS运算符:

SELECT *
FROM [finance].[Accounts] ac
WHERE NOT EXISTS (
SELECT *
FROM finance.AccountMapping ap
WHERE ap.Account_ID = ac.AccountID
)

尝试使用左连接,第二个表的Account_ID为空条件:

SELECT ac.* from [finance].[Accounts] ac
LEFT JOIN finance.AccountMapping ap
ON ap.Account_ID= ac.AccountID'
WHERE ap.Account_ID IS NULL

我希望这对你有帮助。

最新更新