2011-03-08 4 views
8

Когда я делаю левое внешнее соединение, я ожидаю получить все записи, которые запрос вернет до добавления объединенной таблицы, но он возвращает только записи, которые соответствуют объединенным table (т. е. в таблице «документация» отсутствует запись для «092387», поэтому я просто хочу, чтобы null возвращался для поля «filename» для этой записи.) Что я делаю неправильно?Left Outer Join не возвращает все записи из первичной таблицы

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) 

ответ

15

Предложение where where преобразует внешнее соединение обратно во внутреннее.

Не связанные соответствующие строки, сохраняемые outer join будут иметь значения для NULLdocumentation.status поэтому ваше documentation.status != 3 условия будет фильтровать их обратно (результат выражения NULL !=3 является unknown не true).

Чтобы избежать этой проблемы использовать

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' 

Обратите внимание, что documentation.status != 3 предикат перемещается в состояние JOIN.

+0

Правильно ... это было. Спасибо за вашу помощь - это имеет смысл. –

0

Проверьте свое состояние documentation.status!=3 ... это может быть преступник .. Я думаю, что это исключает ваши ожидаемые записи.

Обычно отлаживать этот вопрос запустить свой запрос в части, во-первых RUN-

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

проверка результатов и затем выполнить запрос с где -

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' 

Проверьте результаты они должны измениться после вы добавляете финал, где условие - documentation.status!=3

Возможно, вам следует следовать совету Мартина и запустить его код, чтобы получить exp результаты.

Смежные вопросы