Запрос SQL Left Join с предложением Where удаляет несколько строк из первой таблицы - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть две мобильные таблицы и компания, и я хотел отобразить мобильные данные с соответствующим названием компании. Я пытаюсь выполнить этот SQL-запрос левого соединения.

SELECT m.*,c.company_name 
FROM mobile m 
LEFT JOIN company c 
  ON m.mobile_id=c.mobile_id 
WHERE supplier_id=1 
AND c.company_category=A

Стол компании огромный, поэтому мне нужно использовать company_category в запросе, иначе это займет много времени.

Вот детали таблицы:

1010 * Подвижная *

 supplier_id mobile_name  mobile_color     mobile_id
    -------------------------------------------------
     1           Moto         Red            4324234234234
     1           Xperia       Black          43332
     1           Gold         Black          2342332423433
     2           Smart        White          2342342342342
     2           Jam          Red            32233
     3           Champ        Red            2342342342343

* 1013 компания-*

 company_category          mobile_id           company_name    
    -------------------------------------------------------
     B                     4324234234234           Samsung           
     A                     2342342342342           Apple        
     A                     67                      Sony  

ожидаемый результат-

 supplier_id mobile_name  mobile_color     mobile_id        Company_name
    -------------------------------------------------
     1           Moto         Red            4324234234234    Samsung
     1           Xperia       Black          43332             NULL
     1           Gold         Black          2342332423433     NULL

Но я получаю этот вывод. Выпадает две строки из таблицы мобильных

supplier_id mobile_name  mobile_color     mobile_id        Company_name
    ----------------------------------------------------------------------
     1           Moto         Red            4324234234234    Samsung

Пожалуйста, предложите любой альтернативный SQL-запрос. ию

Ответы [ 3 ]

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

вам не следует использовать левый столбец таблицы соединений в предложении where (c.company_category = A), попробуйте добавить условие в предложение ON

  select m.*
      ,c.company_name 
  from mobile m 
  left join company c on m.mobile_id=c.mobile_id  
      AND  supplier_id=1 
        and c.company_category=A

если вы используете левый столбец соединения, в котором условие работает как внутреннее соединение ..

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

Ваш ожидаемый результат никогда не будет достигнут, потому что supplier_id = 1 and c.company_category = A в этом кенарио ничего не даст. Возможно, ваш кенарий неверен или просто удалите последнее условие: ... and c.company_category = 'A', чтобы получить ожидаемый результат.

Один из вариантов - попробовать что-то вроде этого:

SELECT * FROM mobile m 
LEFT JOIN company c ON m.mobile_id = c.mobile_id 
WHERE supplier_id = 1 and (c.company_category = 'A' OR c.company_category IS NULL)

Живой пример: http://sqlfiddle.com/#!9/187ead/13

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

Вам необходимо переместить критерии where на join. Как есть, это отрицает outer join:

select m.*,c.company_name 
from mobile m 
    left join company c on m.mobile_id=c.mobile_id 
                       and c.company_category='A'
where m.supplier_id=1 

Однако, это не даст вам samsung, поскольку company_category равно b в ваших данных выборки.


Исходя из вашего комментария, это не решит проблем с производительностью, которые вы испытываете, просто верните пропущенные строки. Вместо этого вы должны взглянуть на execution plan и убедиться, что у вас есть соответствующий indices в обеих таблицах. Я бы предложил следующее:

mobile (mobile_id, supplier_id)
company (mobile_id, company_category)
...