2011-03-08 6 views
8

Kiedy wykonuję lewe sprzężenie zewnętrzne, spodziewam się uzyskać wszystkie rekordy, które zapytanie zwróci przed dodaniem połączonej tabeli, ale to tylko zwracające rekordy pasujące do połączonej tabeli table (tj .: brak rekordu dla '092387' istnieje w tabeli 'documentation', więc chcę po prostu zwrócić null dla pola 'filename' dla tego rekordu.) Co robię źle?Left Outer Join nie zwraca wszystkich rekordów z podstawowej tabeli

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) 

Odpowiedz

15

Twoja klauzula where przekonwertuje zewnętrzne połączenie na wewnętrzne.

Objęte zakazem wiersze pasujące zachowane przez outer join będą miały NULL wartości documentation.status więc warunek documentation.status != 3 będzie filtrować je z powrotem (wynik wyrażenia NULL !=3 jest unknown nie true).

Aby uniknąć tego problemu korzystać

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' 

Należy pamiętać, że documentation.status != 3 orzeczenie zostanie przeniesiony w stan JOIN.

+0

Dobrze ... to było to. Dzięki za pomoc - to ma sens. –

0

Sprawdź swój stan documentation.status!=3 ... może to być winowajcą ... myślę, że wyeliminuję twoje oczekiwane zapisy.

Zwykle do debugowania ten problem uruchomić zapytanie w części, po pierwsze Uruchom-

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

Sprawdź wyniki, a następnie uruchomić kwerendę z którym -

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' 

Sprawdź wyniki powinni zmienić raz dodajesz ostateczny, gdzie warunek - documentation.status!=3

Powinieneś pójść za radą Martina i uruchomić swój kod, aby uzyskać exp Rezultaty.