MySQL左外连接与where子句 - 返回不匹配的行

Posted

技术标签:

【中文标题】MySQL左外连接与where子句 - 返回不匹配的行【英文标题】:MySQL left outer join with where clause - return unmatched rows 【发布时间】:2013-07-28 10:58:46 【问题描述】:

我有两个表:pqpe。我正在尝试在右表 (pe) 上 LEFT OUTER JOIN 左表 (pq)。

pq 有主键列 id pe 有两列主键,所以它可能有很多 pqid 或没有 pe.uid 列必须用于仅提取相关数据 (WHERE pe.uid = "12345") pe.data 应该连接到每个 pq.id 行

表格如下所示:

pq:
id | data
1  | "abc"
2  | "efg"

pe:
pqid | uid   | data
2    | 54321 | "uvw"
2    | 12345 | "xyz"

我可以使用以下查询将 pq.id 的前 2 行与 pe.pqid

匹配
SELECT pq.id, pq.data, pe.data FROM pq
    LEFT OUTER JOIN pe ON pq.id = pe.pqid
    ORDER BY pq.id LIMIT 2

我明白了:

pq.id | pq.data |  pe.data
1     | "abc"   |  
2     | "efg"   |  "uvw"

但是如果我像这样使用 WHERE 语句:

SELECT pq.id, pq.data, pe.data FROM pq
    LEFT OUTER JOIN pe ON pq.id = pe.pqid
    WHERE pe.uid='12345'
    ORDER BY pq.id LIMIT 2

我只有一行匹配 pe.pqid AND pe.uid:

pq.id | pq.data |  pe.data
2     | "efg"   |  "xyz"

因此,通过 WHERE 子句,我得到了正确的 pe.data,但没有得到没有 pqpq 行。 id 匹配 pe.pqid

我需要得到这个:

pq.id | pq.data |  pe.data
1     | "abc"   |  
2     | "efg"   |  "xyz"

【问题讨论】:

【参考方案1】:

是的。 where 子句将左外连接变为内连接。

为什么?当没有匹配时,pe.pqid 的值是 NULLpe.uid 也是如此)。所以where 子句中的比较失败(几乎所有与NULL 的比较都返回NULL,这被认为是错误的)。

解决办法是将比较移到on子句:

SELECT pq.id, pq.data, pe.data
FROM pq LEFT OUTER JOIN
     pe
     ON pq.id = pe.pqid and
        pe.uid='12345'
ORDER BY pq.id LIMIT 2

【讨论】:

以上是关于MySQL左外连接与where子句 - 返回不匹配的行的主要内容,如果未能解决你的问题,请参考以下文章

具有许多表、左外连接和 where 子句的 LINQ 查询

如何使用 linq lambda 扩展方法执行带有 where 子句的左外连接

左外连接和右外连接的区别

左外连接不返回主表中的所有记录

Mysql基础04-查询

什么是左外连接 SQLserver