如何使用相关表中的列执行SQL查询?
我有三个相关的SQL表,简化的,就像这样:如何使用相关表中的列执行SQL查询?
ShopTable
[ShopID]
ShelfTable
[ShelfID]
[ShopID]
InventoryTable
[ShelfID]
[Value]
[ShopID]和[ShelfID]有关系。现在,我想要做的就是[超值]的总和一个[ShopID],但是这显然是行不通的,因为[ShopID]不是InventoryTable的一部分:
SELECT SUM([Value]) WHERE [ShopID] = '1'
我怎么有编写查询以使用ShopID过滤InventoryTable?
这是一个关于表之间关系的基本问题,所以我将提供一些细节,希望在将来编写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]中累加值,但您必须指定特定的“商店”。您为[ShelfTable]。[ShelfID]指定@MyShopID,它将在[InventoryTable]中为您执行过滤。
构成查询之前的最后一件事。我假设你没有过多地简化你的表格,并且[Value]是每个“库存项目”的总计值,而不仅仅是单位的值。如果不是,我们不得不按数量乘以数值等,但我会让你在这里检查你自己的工作。
所以,在这里我们做什么:
- 我们选择
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]中的唯一值,因此每个“inventory”一个“架子”。所以加入不会导致我们重复计数值。当你不处理主键和外键时,记住这是一件好事,就像我们在这里做的那样。
希望有所帮助。我希望我没有觉得过于迂腐。
SELECT SUM(i.value)
FROM shelfTable s
JOIN inventoryTable i
ON i.shelfId = s.shelfId
WHERE s.shopId = 1
“[ShopID]和[ShelfID]是关系” - 他们不是。它们被用作主键/外键。在“关系数据库”一词中,关系这个词来自数学理论,SQL数据库世界中的等价物是一个*表*(虽然有一些地方的SQL与数学模型不匹配) – 2011-04-19 10:25:04
@Damien,ah ,对于错误地使用这些条款感到抱歉。 – Sam 2011-04-19 10:54:06