2012-05-30 29 views
0

我發現了一些很好的資源,顯示我應該能夠將選擇查詢與更新合併在一起,但是我無法理解正確的格式。使用不同的SUM更新

我有一個select語句獲取我的信息,我希望幾乎可以使用這些結果來更新與select查詢中的accountID匹配的帳戶表。

這裏是select語句:

SELECT DISTINCT SUM(b.workers)*tt.mealTax as MealCost,b.townID,b.accountID 
FROM buildings AS b 
INNER JOIN town_tax AS tt ON tt.townID = b.townID 
GROUP BY b.townID,b.accountID 

因此,在短期我想上面的查詢與合併:

UPDATE accounts AS a 
SET a.wealth = a.wealth - MealCost 

哪裏MealCost是從選擇查詢的結果。我確信有一種方法可以將它融入其中,我只是沒有能夠將點連接起來,以便在沒有分成兩個查詢的情況下運行。

+0

您正在使用哪個數據庫? –

回答

1

首先,當你有一組時,你不需要獨特。

二,你打算如何鏈接這兩個結果? SELECT查詢每個帳戶返回多行(每個城鎮一個)。據推測,賬目表只有一行。假設您想要更新的平均MealCost。

select查詢得到這個是:

SELECT accountID, avg(MealCost) as avg_Mealcost 
FROM (SELECT SUM(b.workers)*tt.mealTax as MealCost, b.townID, b.accountID 
     FROM buildings AS b INNER JOIN 
      town_tax AS tt 
      ON tt.townID = b.townID 
     GROUP BY b.townID,b.accountID 
    ) a 
GROUP BY accountID 

現在,把這個變成一個更新,你可以使用類似下面的語法:

UPDATE accounts 
    set accounts.wealth = accounts.wealth + asum.avg_mealcost 
    from (SELECT accountID, avg(MealCost) as avg_Mealcost 
      FROM (SELECT SUM(b.workers)*tt.mealTax as MealCost, b.townID, b.accountID 
       FROM buildings AS b INNER JOIN 
        town_tax AS tt 
        ON tt.townID = b.townID 
       GROUP BY b.townID,b.accountID 
       ) a 
      GROUP BY accountID 
     ) asum 
    where accounts.accountid = asum.accountid 

它使用SQL Server語法,這我相信和Oracle和大多數其他數據庫一樣。 Mysql在「set」之前放置「from」子句,並在「更新帳戶」上允許別名。

+0

謝謝你關於獨特的頭腦,這是很好的知道。我可以看到我原來的問題中的錯誤邏輯稍有缺陷。在更新帳戶表之前,我必須爲其他幾個表提取一些不同的信息,所以我可能必須使用多個查詢。感謝您使用這個解決方案,但是當我轉換爲MySQL格式時,它完美地適用於這種情況 – elzaer