2013-07-28 157 views
12

我有兩個表:pqpe。我正在嘗試LEFT OUTER JOIN左表(pq)右表(pe)。MySQL左外連接where子句 - 返回不匹配的行

  • 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到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,但我沒有得到pq行沒有pq .ID匹配PE .pqid

我需要得到這個:

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

回答

30

是。 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