#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`