LEFT OUTER JOIN 難題:記錄數超過左表?
雖然普遍認為 LEFT OUTER JOIN 總是返回左表的所有記錄,但一位用戶卻對查詢返回的結果數量超過預期感到困惑。
有問題的 SQL 查詢:
SELECT SUSP.Susp_Visits.SuspReason, SUSP.Susp_Visits.SiteID FROM SUSP.Susp_Visits LEFT OUTER JOIN DATA.Dim_Member ON SUSP.Susp_Visits.MemID = DATA.Dim_Member.MembershipNum
揭開真相:
誤解在於假設 LEFT OUTER JOIN 只會為左表中不匹配的行返回 NULL 值。實際上,它會返回所有匹配的行,即使右表中的多行與左表中的一行匹配也是如此。
示例說明:
考慮以下表格:
**Susp_Visits** | **Dim_Member** | |
---|---|---|
MemID: 1 | MembershipNum: 1 | |
MemID: 1 | MembershipNum: 2 | |
MemID: 2 | MembershipNum: NULL |
基於 MemID 的 LEFT OUTER JOIN 將產生以下結果:
**SuspReason** | **SiteID** | **MembershipNum** |
---|---|---|
1 | 1 | 1 |
1 | 1 | 2 |
2 | 2 | NULL |
正如您所看到的,Susp_Visits.SuspReason 為 1 的行被重複,因為它與 Dim_Member 中的兩行匹配。
替代方法:
如果所需結果只是檢索左表中唯一行,則不需要 LEFT OUTER JOIN。只需從左表中進行簡單的 SELECT 即可:
SELECT SuspReason, SiteID FROM SUSP.Susp_Visits
以上是左外連接拼圖:為什麼結果比左表記錄更多?的詳細內容。更多資訊請關注PHP中文網其他相關文章!