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

时间:2018-07-02 11:20:15

标签: sql sql-server sql-server-2008 tsql stored-procedures

在过去的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的记录。为什么?我已经提到了返回不匹配的记录。

4 个答案:

答案 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

我希望这会对您有所帮助。