我有两个表: pq 和 pe 。我正在尝试将右桌子( pe )放在LEFT OUTER JOIN左桌子( pq )上。
LEFT OUTER JOIN
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和 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"
是的。该where子句将左外部联接变成内部联接。
where
为什么?的值pe.pqid就是NULL(如pe.uid)当不存在匹配。因此,where子句中的比较失败(几乎所有NULL返回的比较NULL都被认为是错误的)。
pe.pqid
NULL
pe.uid
解决方案是将比较移到该on子句:
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