web-dev-qa-db-ja.com

MySQLはwhere句を使用した外部結合を残しました-一致しない行を返します

pqpeの2つのテーブルがあります。私は。。をしようとしています LEFT OUTER JOIN左テーブル(pq)右テーブル(pe)。

  • pqには主キー列がありますid
  • peには2列の主キーがあるため、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の最初の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"
15
Xeos

はい。 where句は、左外部結合を内部結合に変えています。

どうして?一致がない場合、pe.pqidの値はNULLpe.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
40
Gordon Linoff