Теперь, когда стало ясно, что вы used b.case_id=1
, я объясню, почему он фильтрует:
Сам LEFT JOIN возвращает несколько строк, которые содержат все значения NULL для таблицы b
в наборе результатов, чего вы и ожидаете.
Но при использовании WHERE b.case_id=1
строки, содержащие значения NULL для таблицы b
, отфильтровываются, поскольку ни одна из них не соответствует условию (все эти строки имеют b.case_id=NULL
, поэтому они не совпадают).
Возможно, вместо этого можно использовать WHERE a.case_id=1
, но мы не знаем, являются ли a.case_id
и b.case_id
всегда одинаковыми значениями для совпадающих строк (они могут не совпадать; и если они всегда одинаковы, то мы только что определили потенциальную избыточность).
Есть два способа исправить это наверняка .
(1) Переместить b.case_id = 1
в состояние левого соединения:
left join address_details b on a.street_no = b.street_no and b.case_id = 1
(2) Оставьте b.case_id = 1
в WHERE, но также допускайте значения NULLED-out b
:
left join address_details b on a.street_no = b.street_no
where b.case_id = 1
or b.street_no IS NULL
Лично Я бы пошел на (1) , потому что это самый понятный способ выразить, что вы хотите отфильтровать b
по двум условиям, не затрагивая строки a
, которые возвращаются.