15

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 を取得できますが、 pe .pqidに一致するpq .idを持たないpq行は取得されません。

私はこれを取得する必要があります:

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

1 に答える 1

43

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

なんで?一致しない場合の値pe.pqidNULL(そのまま) です。pe.uidそのため、句の比較は失敗します ( false と見なさ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
于 2013-07-28T17:23:29.513 に答える