Inner Join和Left Join在同一个sql查询中

时间:2015-04-04 11:25:22

标签: sql-server sql-server-2008 join left-join

我正在尝试执行内连接,然后在相同的sql查询中保持连接。 但左连接不起作用。它没有显示空值

我有两张表EVENT_INVITATIONSUSERINFO,它们在加入时有2条记录。

所以,join查询是这样的:

select * from [UandMePROD].[dbo].EVENT_INVITATIONS EI
join [UandMePROD].[dbo].USERINFO UI on EI.USER_ID = UI.USER_ID and EI.EVENT_ID=11033

它提供了2条记录。

所以,我正在使用另一个表left join执行CLIENT_CONTACTS,其中只有一个匹配的记录。

所以,实际上它应该为不匹配的记录显示空值。但它没有显示第二条记录。它只显示匹配(加入)

的1条记录

我的sql查询失败:

select * from [UandMePROD].[dbo].EVENT_INVITATIONS EI
join [UandMePROD].[dbo].USERINFO UI on EI.USER_ID = UI.USER_ID 
 left  join CLIENT_CONTACTS CC  on UI.MOBILENO=CC.MOBILE_NUMBER  
where cc.CLIENT_ID=20111 and EI.EVENT_ID=11033
你可以告诉我我在哪里做错了吗? 我需要2条记录。

3 个答案:

答案 0 :(得分:1)

由于您正在进行左连接,cc.CLIENT_ID对于仅存在于CLIENT_CONTACTS和where子句Where cc.CLIENT_ID = 20111中的所有值都为空 将您的LEFT JOIN转换为INNER JOIN。在ON子句中添加此过滤器可解决此问题。

select * 
from [UandMePROD].[dbo].EVENT_INVITATIONS EI
inner join [UandMePROD].[dbo].USERINFO UI on EI.[USER_ID] = UI.[USER_ID] 
 left join CLIENT_CONTACTS CC             on UI.MOBILENO = CC.MOBILE_NUMBER                 
                                         and cc.CLIENT_ID = 20111
where  EI.EVENT_ID=11033

答案 1 :(得分:0)

您不应在WHERE子句上指定EI.EVENT_ID。这些限制了您在加入后的结果。您应该在ON子句中指定EI.EVENT_ID。

select * from [UandMePROD].[dbo].EVENT_INVITATIONS EI join [UandMePROD].[dbo].USERINFO UI on EI.USER_ID = UI.USER_ID AND   (EI.EVENT_ID=11033 or EI.EVENT_ID is null) left  join CLIENT_CONTACTS CC  on UI.MOBILENO=CC.MOBILE_NUMBER  where cc.CLIENT_ID=20111

答案 2 :(得分:0)

提供一些建议,因为无法说明表格数据发生了什么

左连接应该显示来自第一个内部连接的输出的空值,尽管没有移动数字匹配,所以请尝试删除where条件并查看是否获得任何结果