如何使用相关表中的列执行SQL查询?

问题描述:

我有三个相关的SQL表,简化的,就像这样:如何使用相关表中的列执行SQL查询?

ShopTable 
    [ShopID] 

ShelfTable 
    [ShelfID] 
    [ShopID] 

InventoryTable 
    [ShelfID] 
    [Value] 

[ShopID]和[ShelfID]有关系。现在,我想要做的就是[超值]的总和一个[ShopID],但是这显然是行不通的,因为[ShopID]不是InventoryTable的一部分:

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

我怎么有编写查询以使用ShopID过滤InventoryTable?

+0

“[ShopID]和[ShelfID]是关系” - 他们不是。它们被用作主键/外键。在“关系数据库”一词中,关系这个词来自数学理论,SQL数据库世界中的等价物是一个*表*(虽然有一些地方的SQL与数学模型不匹配) – 2011-04-19 10:25:04

+0

@Damien,ah ,对于错误地使用这些条款感到抱歉。 – Sam 2011-04-19 10:54:06

这是一个关于表之间关系的基本问题,所以我将提供一些细节,希望在将来编写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
  • ,然后我们SELECTSUM([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”一个“架子”。所以加入不会导致我们重复计数值。当你不处理主键和外键时,记住这是一件好事,就像我们在这里做的那样。

希望有所帮助。我希望我没有觉得过于迂腐。

+0

不要太迂腐,这是一个很好的解释,谢谢!是的,价值是简化的,实际上它是SUM([数量] * [价格]/[价格单位] * [加权]),但这是容易的部分:) – Sam 2011-04-19 13:27:37

+0

谢谢!而且,这是很多等待处理的! :) – eksortso 2011-04-20 18:23:53

SELECT SUM(i.value) 
FROM shelfTable s 
JOIN inventoryTable i 
ON  i.shelfId = s.shelfId 
WHERE s.shopId = 1