2013-07-28 13 views
12

Ho due tabelle: pq e pe. Sto provando a tabella LEFT OUTER JOIN sinistra (pq) sulla tabella di destra (pe).MySQL left outer join with where clausola - restituisce righe non corrispondenti

  • pq ha primario colonna chiave id
  • pe ha due colonne chiave primaria, quindi potrebbe avere molti pqid del o nessuno
  • pe colonna .UID deve essere usato per estrarre solo i dati rilevanti (WHERE pe.uid = "12345")
  • pe. i dati devono essere uniti a ogni pq fila .ID

Ecco come tavoli guardano:

pq: 
id | data 
1 | "abc" 
2 | "efg" 

pe: 
pqid | uid | data 
2 | 54321 | "uvw" 
2 | 12345 | "xyz" 

posso utilizzare la seguente query per abbinare prime 2 file di pq .id di 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 

Ottengo:

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

Ma se io uso l'istruzione WHERE in questo modo:

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 

Ho solo una riga con corrispondenti pe .pqid E pe .UID:

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

Quindi, con la WHERE clausola ottengo la destra pe .data, ma non ho pq righe che non hanno pq .id corrispondenza pe .pqid

ho bisogno di ottenere questo:

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

risposta

30

Sì. La clausola where sta trasformando la giuntura esterna sinistra in una giunzione interna.

Perché? Il valore di pe.pqid è NULL (come pe.uid) quando non c'è corrispondenza. Pertanto, il confronto nella clausola where non riesce (quasi tutti i confronti con NULL restituiscono NULL che è considerato falso).

La soluzione è spostare il confronto con la clausola 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