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

l--*_*''' 1 sql t-sql sql-server-2008 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
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

鉴于此查询显示o.OwnerId=b.systemuserid某些记录确实如此:

select distinct assignedto 
  from Opportunity
 where assignedto in (select distinct systemuserid 
                       from crmtestdb.dm1_mscrm.dbo.systemuserbase)
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

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

Zan*_*ane 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
    )
Run Code Online (Sandbox Code Playgroud)

你没有匹配相同的东西.在一个查询您选择Assignedto和匹配OwnerID,以sytemuserID在第二你正在寻找在那里分配到的INsystemuserId尝试改变第二查询

select distinct 
    assignedto 
from Opportunity
  where OwnerId in (
    select distinct 
        systemuserid 
    from crmtestdb.dm1_mscrm.dbo.systemuserbase
    )
Run Code Online (Sandbox Code Playgroud)