Left Outer Join не возвращает все записи из первичной таблицы - PullRequest
8 голосов
/ 08 марта 2011

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

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)

Ответы [ 2 ]

15 голосов
/ 08 марта 2011

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

Несоответствующие строки, сохраненные outer join, будут иметь NULL значения для documentation.status, поэтому ваше условие documentation.status != 3 отфильтрует их обратно (результат выражения NULL !=3 равен unknown not 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 голосов
/ 08 марта 2011

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

Обычно для устранения этой проблемы запустите ваш запрос по частям, сначала запустите-

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

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

...