SQL LEFT JOIN исключает членов в зависимости от того, с чем он соединяется? - PullRequest
0 голосов
/ 01 октября 2018

У меня есть база данных, в которой иногда языковые записи определяются для конкретных номеров элементов в таблице «GHS_ItemStoreHandle», а иногда нет.Почему первый запрос возвращает меньше элементов, чем второй?Не должны ли оба возвращать количество строк, равное количеству активных языков в таблице «Язык»?

SELECT l.NativeName, l.Id, i.ItemNumber, i.StoreHandle FROM Language l 
  LEFT JOIN GHS_ItemStoreHandle i ON l.Code = i.Lang_Code 
  WHERE l.Active = 1 AND 
  (i.ItemNumber = 'MM1-931' OR i.ItemNumber IS NULL) 
  ORDER BY l.NativeName;

SELECT l.NativeName, l.Id, l.Active FROM Language l
  WHERE l.Active = 1
  ORDER BY l.NativeName;

1 Ответ

0 голосов
/ 01 октября 2018

Требуется условие в предложении ON, а не в предложении WHERE:

SELECT l.NativeName, l.Id, i.ItemNumber, i.StoreHandle
FROM Language l LEFT JOIN
     GHS_ItemStoreHandle i
     ON l.Code = i.Lang_Code AND i.ItemNumber = 'MM1-931'
WHERE l.Active = 1 
ORDER BY l.NativeName;

Причина, по которой ваша версия возвращает неожиданные результаты, заключается в том, что иногда i не имеет MM1-931', ноимеет другое значение .Они отфильтрованы вашей логикой.

...