2016-10-17 40 views
2

你可以運行這個並告訴我爲什麼結果集只有兩行。它應該有三個,看起來像這樣...爲什麼我的t-sql左連接不起作用?

appId stepId  section  start 
101  1   Section 1  2016-01-03 00:00:00.000 
101  2   Section 2  2016-01-03 00:00:00.000 
101  10   Section 3  NULL 

這裏是SQL,所以你只需將其粘貼到您的查詢工具

create table #appSteps(stepId decimal, section nvarchar(50)) 
insert into #appSteps (stepId, section) values (1, 'Section 1') 
insert into #appSteps (stepId, section) values (2, 'Section 2') 
insert into #appSteps (stepId, section) values (3, null) 
insert into #appSteps (stepId, section) values (4, null) 
insert into #appSteps (stepId, section) values (10, 'Section 3') 

create table #appProgress(stepId decimal, appId int, start datetime) 
insert into #appProgress (stepId, appId, start) values (1, 101, '1/3/2016') 
insert into #appProgress (stepId, appId, start) values (2, 101, '1/3/2016') 
insert into #appProgress (stepId, appId, start) values (3, 101, '1/3/2016') 
insert into #appProgress (stepId, appId, start) values (4, 101, '1/3/2016') 


select p.appId, s.stepId, s.section, p.start 
from #appSteps s with (nolock) 
left join #appProgress p on s.stepId = p.stepId 
where s.section is not null 
and p.appId = 101 

drop table #appSteps 
drop table #appProgress 

我想不通爲什麼從所有3個非空行#appSteps不會回來

回答

6

原因是因爲您在WHERE條款中包含右側表格。你應該將其移至LEFT JOINON條件:

Select P.appId, S.stepId, S.section, P.start 
From  #appSteps S With (NoLock) 
Left Join #appProgress P On S.stepId = P.stepId 
          And P.appId = 101 
Where  S.section Is Not Null 

它這樣做是因爲WHERE子句的LEFT JOIN後評估,然後過濾掉你從LEFT JOINNULL結果的原因。

包括WHERE子句中的一個LEFT JOIN的右側表(或RIGHT JOIN的左側表)有效地變換OUTER JOININNER JOIN

+1

非常感謝洙。這是工作 – Roto

+0

@Siyual好的解釋。 –