在过去的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 在AccountMapping表中,我们有一个account_ID 1,2
,但以上查询仍返回1,2的记录。为什么?我已经提到了返回不匹配的记录。
答案 0 :(得分: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
);
答案 1 :(得分:1)
您正在寻找使用EXCEPT可以实现的结果
Select AccountID from AccountMapping
Except
Select AccountID from Accounts
答案 2 :(得分:1)
您误解了内部联接的ON
子句的工作方式:对于第一个表的每个记录,它将在联接表中找到满足条件的 all 条记录。只要您对外键与主键进行等值连接,您最多可获得一条记录。切换到<>
,>
,<
等之后,您可能会为第一个表的每个记录获取多个联接记录。
在您的示例中,您正在寻找ID不匹配的所有行。对于存在量词,即EXISTS
运算符,这是一个完美的例子:
SELECT *
FROM [finance].[Accounts] ac
WHERE NOT EXISTS (
SELECT *
FROM finance.AccountMapping ap
WHERE ap.Account_ID = ac.AccountID
)
答案 3 :(得分:1)
尝试左连接,并且第二张表的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
我希望这会对您有所帮助。