一尘不染

MySQL使用where子句离开外部连接-返回不匹配的行

sql

我有两个表: 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的前两行与 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和 pe .uid的一行:

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

所以有了WHERE子句,我得到了正确的 pe* .data,但是我没有得到没有与 pe .pqid相匹配的 pq .id的
pq 行。
***

我需要得到这个:

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

阅读 160

收藏
2021-03-17

共1个答案

一尘不染

是的。该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
2021-03-17