使用LEFT JOIN会产生与使用IN不同的结果

时间:2014-03-13 15:34:55

标签: sql sql-server-2008 tsql dynamics-crm-2011

我想知道你是否能揭开为什么这两个应该产生相同结果的查询实际产生不同结果的谜团。第一个查询产生的结果不正确。

以下查询显示o.OwnerId=b.systemuserid永远不会成立:

select distinct o.assignedto,b.systemuserid 
  from Opportunity o
  left join crmtestdb.dm1_mscrm.dbo.systemuserbase b
    on o.OwnerId = b.systemuserid

因为它返回右侧的所有空值:

enter image description here

尽管此查询显示某些记录确实存在o.OwnerId=b.systemuserid

select distinct assignedto 
  from Opportunity
 where assignedto in (select distinct systemuserid 
                       from crmtestdb.dm1_mscrm.dbo.systemuserbase)

这表明他们确实有这些共同的领域:

enter image description here

这里发生了什么?我究竟做错了什么?如果您需要澄清任何事情,请告诉我。

1 个答案:

答案 0 :(得分:6)

select distinct 
    o.assignedto,
    b.systemuserid 
from Opportunity o
left join  crmtestdb.dm1_mscrm.dbo.systemuserbase b
    on o.OwnerId=b.systemuserid 
    --here you are matching Onwer to sysuser

select distinct 
    assignedto 
from Opportunity
where assignedto in (
    select distinct 
        systemuserid 
        --here you are matching assignedto to sysuser
        --this is not equivilant
    from crmtestdb.dm1_mscrm.dbo.systemuserbase
    )

你在相同的事情上不匹配。在一个查询中,您选择Assignedto并将OwnerIDsytemuserID匹配,在您搜索的第二个IN系统用户ID中尝试将第二个查询更改为

select distinct 
    assignedto 
from Opportunity
  where OwnerId in (
    select distinct 
        systemuserid 
    from crmtestdb.dm1_mscrm.dbo.systemuserbase
    )