在过去的 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
我希望这对你有帮助。