MySQL使用where子句保留外连接 - 返回不匹配的行

时间:2013-07-28 17:16:05

标签: mysql sql join left-join

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

  • 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与 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,但我没有得到 pq 没有 pq 的行。 id匹配 pe .pqid

我需要得到这个:

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

1 个答案:

答案 0 :(得分:39)

是。 where子句将左外连接转换为内连接。

为什么呢?当没有匹配时,pe.pqid的值为NULL(如pe.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