2011-04-19 60 views
0

我有三個相關的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

回答

2

這是一個關於表之間關係的基本問題,所以我將提供一些細節,希望在將來編寫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

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