pqとpeの2つのテーブルがあります。私は。。をしようとしています 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の最初の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に一致する行を1つだけ取得します。
pq.id | pq.data | pe.data
2 | "efg" | "xyz"
したがって、WHERE句を使用すると、正しいpe。dataを取得できますが、pq。idに一致しないpq行を取得できません- pe。pqid
私はこれを取得する必要があります:
pq.id | pq.data | pe.data
1 | "abc" |
2 | "efg" | "xyz"
はい。 where
句は、左外部結合を内部結合に変えています。
どうして?一致がない場合、pe.pqid
の値はNULL
(pe.uid
と同じ)になります。そのため、where
句の比較は失敗します(NULL
へのほとんどすべての比較は、falseと見なされる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