左連接差異:省略行
在此查詢中,表#appSteps 和#appProgress 之間的LEFT JOIN 出現故障,導致從結果集中排除預期行。
查詢問題中:
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
預期結果:
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 |
實際結果:
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 |
解:
錯誤的行為是由於在WHERE 子句中包含右側表 (#appProgress) 所造成的。透過將此條件移至LEFT JOIN 的ON 子句,可以實現所需的結果:
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
在LEFT JOIN 中,WHERE 子句在聯接之後執行,這意味著從右開始的行-不符合WHERE 子句條件的手錶將從結果集中排除。在 WHERE 子句中包含右側表格可以有效地將其轉換為 INNER JOIN,從而過濾掉預期結果。
以上是為什麼我的左連接結果缺少行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!