我有两张桌子: pq 和 pe 。我正在尝试LEFT OUTER JOIN
左表( pq )在右表( pe )上。
WHERE pe.uid = "12345"
)以下是表格的外观:
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"
答案 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