Как сделать SQL-запрос, используя столбцы из связанной таблицы? - PullRequest
0 голосов
/ 19 апреля 2011

У меня есть три связанные таблицы SQL, упрощенно они выглядят так:

ShopTable
  [ShopID]

ShelfTable
  [ShelfID]
  [ShopID]

InventoryTable
  [ShelfID]
  [Value]

[ShopID] и [ShelfID] являются отношениями.Теперь я хочу получить сумму [Value] для одного [ShopID], но это, очевидно, не сработает, поскольку [ShopID] не является частью InventoryTable:

SELECT SUM([Value]) WHERE [ShopID] = '1'

Как мнеНужно написать запрос для фильтрации InventoryTable, используя ShopID?

Ответы [ 2 ]

4 голосов
/ 19 апреля 2011
SELECT  SUM(i.value)
FROM    shelfTable s
JOIN    inventoryTable i
ON      i.shelfId = s.shelfId
WHERE   s.shopId = 1
2 голосов
/ 19 апреля 2011

Это фундаментальный вопрос об отношениях между таблицами, поэтому я приведу некоторые подробности, надеясь, что вы сможете использовать некоторые из этих идей при написании 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], и ​​поэтому каждая вещь «инвентаря» принадлежит одна "полка". Таким образом, объединение не приведет к двойному счету значений. Это хорошо помнить, когда вы не имеете дело с первичными и внешними ключами, как мы делаем здесь.

Надеюсь, это поможет. И я надеюсь, что я не выглядел слишком педантичным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...