2011-03-08 5 views
8

Quando eseguo un join esterno sinistro, mi aspetto di ottenere tutti i record che la query restituirà prima di aggiungere la tabella unita, ma solo i record di restituzione che corrispondono ai join tabella (es: nessun record per '092387' esiste nella tabella 'documentation', quindi voglio solo null restituito per il campo 'filename' per quel record.) Cosa sto facendo male?Left Outer Join non restituisce tutti i record dalla tabella primaria

mysql> select documentation_reference.ref_docnumber 
      , documentation.filename 
     from documentation_reference 
     left outer join documentation on ref_docnumber=documentation.docnumber  
     where documentation_reference.docnumber='TP-036' 
     and documentation.status!=3; 
+---------------+-----------------+ 
| ref_docnumber | filename  | 
+---------------+-----------------+ 
| SOP-0042  | SOP-0042r39.pdf | 
+---------------+-----------------+ 
1 row in set (0.00 sec) 

mysql> select ref_docnumber 
     from documentation_reference 
     where documentation_reference.docnumber='TP-036'; 
+----------------------+ 
| ref_docnumber  | 
+----------------------+ 
| 092387    | 
| 1100218B    | 
| Applicable Item Spec | 
| SOP-0042    | 
+----------------------+ 
4 rows in set (0.00 sec) 

risposta

15

La clausola where sta convertendo l'unione esterna in una interna.

Le righe non corrispondenti conservati dal outer join avranno tutti NULL valori per documentation.status modo che la condizione documentation.status != 3 filtrerà questi indietro (Il risultato dell'espressione NULL !=3 non unknowntrue).

Per evitare questo problema utilizzare

select documentation_reference.ref_docnumber, 
     documentation.filename 
from documentation_reference 
     left outer join documentation 
     on ref_docnumber = documentation.docnumber 
      and documentation.status != 3 
where documentation_reference.docnumber = 'TP-036' 

Nota che il predicato documentation.status != 3 viene spostato nella condizione JOIN.

+0

Giusto ... è stato. Grazie per il tuo aiuto, questo ha senso. –

0

Controlla la tua condizione documentation.status!=3 ... potrebbe essere il colpevole.è penso che eliminando i record attesi.

solito eseguire il debug di questo problema eseguire la query in alcune parti, in primo luogo ruscellamento

select documentation_reference.ref_docnumber, documentation.filename from documentation_reference left outer join documentation on ref_docnumber=documentation.docnumber 

controllo i risultati e quindi eseguire query con il dove -

select documentation_reference.ref_docnumber, documentation.filename from documentation_reference left outer join documentation on ref_docnumber=documentation.docnumber 
where documentation_reference.docnumber = 'TP-036' 

Controllare i risultati dovrebbero cambiare una volta aggiungi la finale dove condizioni - documentation.status!=3

Probabilmente dovresti seguire il consiglio di Martin ed eseguire il suo codice per ottenere l'exp risultati