Это фундаментальный вопрос об отношениях между таблицами, поэтому я приведу некоторые подробности, надеясь, что вы сможете использовать некоторые из этих идей при написании SQL-запросов в будущем.
Давайте начнем с одной основной вещи. [ShopID] может ссылаться на два разных, но связанных столбца, один в [ShopTable] и один в [ShelfTable]. То же самое относится и к [ShelfID]. Полезно всегда указывать таблицу.
Вы описываете [ShopID] и [ShelfID] как «отношения». Как прокомментировал Damien_The_Unbeliever, эти столбцы на самом деле представляют собой две пары первичных и внешних ключей. То есть [ShelfTable]. [ShelfID] идентифицирует запись «полки», а [InventoryTable]. [ShelfID] связывает «элемент инвентаря» (независимо от того, что это) с «полкой». (Не всегда возможно наивно интерпретировать строки в базе данных, но я готов догадаться, что я не слишком далек от реальности.)
Аналогично, каждая «полка» принадлежит одному «магазину», а [ShelfTable]. [ShopID] относится к этому конкретному «магазину». Обратите внимание, что поскольку у нас уже есть значение [ShopID] (я назову его «@MyShopID»), нам даже не нужен [ShopTable] здесь. Мы можем просто использовать [ShelfTable]. [ShopID], чтобы отфильтровать интересующие нас «полки».
Вы просите получить общую сумму [InventoryTable]. [Value] для одного значения [ShopID], но [ShopID] не отображается в [InventoryTable]. Вот где ваше (внутреннее) соединение вступает в игру. Вы знаете, что будете добавлять значения из [InventoryTable], но вам нужно указать конкретный «магазин». Вы указываете @MyShopID для [ShelfTable]. [ShelfID], который будет выполнять фильтрацию в [InventoryTable] для вас.
Последнее, что нужно сделать перед составлением запроса. Я предполагаю, что вы не слишком упрощали свои таблицы, и что [Value] - это значение total каждого «предмета инвентаря», а не просто значение unit . Если бы это было не так, нам пришлось бы умножать значения на количества и т. Д., Но я позволю вам проверить свою работу здесь.
Итак, вот что мы делаем:
- Выбираем
FROM
[InventoryTable]
- но мы
INNER JOIN
до [ShelfTable]
на [ShelfID] из обеих таблиц
- и нам нужны «полки» только из одного «магазина», т.е.
WHERE [ShelfTable].[ShopID] = @MyShopID
- и тогда мы
SELECT
SUM([InventoryTable].[Value])
и мы закончили. В SQL давайте уберем скобки, предоставим псевдонимы таблиц и получим запрос, который выглядит следующим образом:
SELECT SUM(inv.Value)
FROM InventoryTable AS inv
INNER JOIN ShelfTable AS shf ON shf.ShelfID = inv.ShelfID
WHERE shf.ShopID = @MyShopID
;
Вот несколько моментов на вынос, которые следует рассмотреть. Обратите внимание, что сначала мы обработали предложение FROM. Вы всегда будете хотеть сделать это.
Вам также понадобится начать с «таблицы вождения», в данном случае [InventoryTable]. Другие таблицы в вашем объединении добавляют дополнительную информацию и предоставляют вам средства для фильтрации, но в остальном не мешают вашему обобщению. Более сложные запросы не предлагают такой очевидной роскоши, но здесь мы не слишком увлекаемся.
Вы также кратко заметите, что поскольку [ShelfID] является первичным ключом в [ShelfTable], эти [ShelfID] являются уникальными значениями в [ShelfTable], и поэтому каждая вещь «инвентаря» принадлежит одна "полка". Таким образом, объединение не приведет к двойному счету значений. Это хорошо помнить, когда вы не имеете дело с первичными и внешними ключами, как мы делаем здесь.
Надеюсь, это поможет. И я надеюсь, что я не выглядел слишком педантичным.