JOIN запрос, SQL Server отбрасывает некоторые строки моей первой таблицы - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть две таблицы customer_details и address_details. Я хочу отобразить информацию о клиенте с соответствующим адресом, поэтому я использовал LEFT JOIN, но когда я выполняю этот запрос, SQL Server удаляет строки, где street_no таблицы customer_details не совпадает с street_no в таблице address_detials и отображает только те строки, где `street_no 'customer_detials = street_no таблицы address_details. Мне нужно отобразить полную таблицу customer_details, и в случае, если street_no не совпадает, должна отображаться пустая строка или что-то еще. Я делаю что-то не так в моем соединении SQL?

Таблица customer_details:

case_id customer_name  mob_no       street_no
-------------------------------------------------
 1           John      242342343    4324234234234
 1           Rohan     343233333    43332
 1           Ankit     234234233    2342332423433
 1           Suresh    234234324    2342342342342
 1           Ranjeet   343424323    32233
 1           Ramu      234234333    2342342342343

Таблица address_details:

 s_no   streen_no       address        city    case_id
 ------------------------------------------------------
  1     4324234234234   Roni road      Delhi    1
  2     2342332423433   Natan street   Lucknow  1
  3     2342342342342   Koliko road    Herdoi   1   

Запрос SQL JOIN:

select  
    a.*, b.address 
from 
    customer_details  a 
left join 
    address_details b on a.street_no = b.street_no 
where 
    b.case_id = 1 

Ответы [ 3 ]

0 голосов
/ 06 сентября 2018

Я думаю, что ответ Вильгельма Поггенпола является правильным. Вам просто нужно изменить условие последнего соединения a .case_id = 1 на b .case_id = 1

select  a.* , b.address 
from customer_details  a 
  left join address_details b on a.street_no=b.street_no 
  and b.case_id=1

Этот запрос покажет каждую строку из customer_details и соответствующий адрес, если есть совпадение street_no и адрес соответствует условию case_id=1.

0 голосов
/ 07 сентября 2018

Теперь, когда стало ясно, что вы 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, которые возвращаются.

0 голосов
/ 06 сентября 2018

Это из-за предложения where. Попробуйте это:

select  a.* , b.address 
from customer_details  a 
  left join address_details b on a.street_no=b.street_no 
and a.case_id=1
...