簡體   English   中英

MySQL使用where子句保留外連接 - 返回不匹配的行

[英]MySQL left outer join with where clause - return unmatched rows

我有兩張桌子: pqpe 我想LEFT OUTER JOIN留在右表(PE)(PQ)。

  • pq具有主鍵列id
  • pe有兩列主鍵,所以它可能有很多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:

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子句將左外連接轉換為內連接。

為什么? 當沒有匹配時, 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM