在SQL 中使用LEFT JOIN 時,認識到其獨特特徵和潛在陷阱至關重要。這個問題說明了一個範例,其中 LEFT JOIN 查詢傳回意外結果,促使我們深入研究底層機制並解決問題。
LEFT JOIN 操作會從左表中檢索所有行(在本例中, #appSteps),無論它是否與右表(#appProgress)相符。右表中任何不匹配的行都會被指派 NULL 值。但是,當您在 WHERE 子句 (p.appId = 101) 中包含正確的資料表時,您實際上會將查詢轉換為 INNER JOIN。
解:
要修正問題,需要將過濾右表(p.appId = 101)的謂詞從WHERE 子句移至ON LEFT JOIN 語句的條件。這會強制連接在執行連接之前過濾正確的表,確保僅包含匹配的行。
調整後的SQL 語句如下:
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 功能,它將產生預期的結果,包括#appSteps 中的所有非空白行和#appProgress 中的符合行,而不會因為額外的原因而無意中排除行WHERE 子句中的謂詞。
以上是為什麼 SQL 中的 LEFT JOIN 會回傳意外結果?的詳細內容。更多資訊請關注PHP中文網其他相關文章!