LEFT OUTER JOIN 难题:记录数超过左表?
虽然普遍认为 LEFT OUTER JOIN 总是返回左表的所有记录,但一位用户却对查询返回的结果数量超过预期感到困惑。
有问题的 SQL 查询:
<code class="language-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</code>
揭开真相:
误解在于假设 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 即可:
<code class="language-sql">SELECT SuspReason, SiteID FROM SUSP.Susp_Visits</code>
以上是LEFT OUTER JOIN 谜题:为什么结果多于左表记录?的详细内容。更多信息请关注PHP中文网其他相关文章!