sql-запрос с ВНУТРЕННИМ соединением, созданный для возврата определенных значений при совпадении с числом

#sql #inner-join

#sql #внутреннее соединение

Вопрос:

Я попытаюсь объяснить это наилучшим способом, который я могу.

У меня есть SQL-запрос, который выполняет 3 внутренних соединения с 3 таблицами для сопоставления двух идентификаторов (т. Е. у меня есть таблица ‘Item’ и таблица ‘ItemType’. item.itemTypeID связан с itemType.id ).

В моем коде, если с элементом не связан ItemType, то item.itemTypeID устанавливается равным -1.

Однако, когда дело доходит до этого запроса, такого ItemType с идентификатором -1 не существует, поэтому он не возвращается с записью.

Мне нужно, чтобы он возвращался со всеми записями, имеющими ItemType, но также и со всеми теми записями, у которых ItemType равен -1, и устанавливал для соответствующих возвращаемых элементов значение NULL.

Мой SQL-запрос выглядит следующим образом;

` ВЫБЕРИТЕ items.id

  , items.code
 , items.description
 , items.expirydate
 , items.batchnumber
 , items.serialnumber
 , items.orderref
 , items.datepurchased
 , items.price
 , items.consigcalloff
 , items.commodity_qty
 , itemtypes.code
 , itemtypes.description
 , locations.code
 , locations.description
 , keepers.code
 , keepers.fname
 , keepers.lname
FROM items inner join itemtypes ON items.type = itemtypes.id inner join keepers ON items.keeper = keepers.id inner join locations ON items.location = locations.id`
  

Комментарии:

1. Действительно ли значения -1 хранятся в таблице items в items. ItemTypeID? или определено отношение pk-fk, которое предотвратило бы это?

Ответ №1:

Вам понадобится внешнее соединение.. Это вернет все записи из таблицы items, независимо от того, есть ли у них совпадение в таблице ItemType или нет. Когда совпадения не существует, поля ItemType будут равны null..

 SELECT items.id
 , items.code
 , items.description
 , items.expirydate
 , items.batchnumber
 , items.serialnumber
 , items.orderref
 , items.datepurchased
 , items.price
 , items.consigcalloff
 , items.commodity_qty
 , itemtypes.code
 , itemtypes.description
 , locations.code
 , locations.description
 , keepers.code
 , keepers.fname
 , keepers.lname
FROM items 
       left outer join join itemtypes ON items.type = itemtypes.id 
       inner join keepers ON items.keeper = keepers.id 
       inner join locations ON items.location = locations.id`