2010-01-11 72 views
3

如何使用sql update語句中的聚合函數更新表的列?使用從聚合函數返回的值更新

+0

這太模糊了,但它聽起來有點可疑,以非規範化的方式。請詳細說明您正在努力達到的目標,以便我們能夠更好地回答您的問題。 – APC 2010-01-11 11:24:36

回答

5

根據定義,聚合函數將輸入的一個或多個記錄聚合到結果集中的單個記錄中,因此不清楚要更新哪個記錄。 (在MySQLSQL Server作品)

UPDATE mytable 
JOIN (
     SELECT yetothercol, SUM(othercol) AS psum 
     FROM othertable 
     GROUP BY 
       yetothercol 
     ) s 
ON  yetmycol = yetothercol 
SET  mycol = psum 

,或者在MERGE聲明(在作品

UPDATE mytable 
SET  mycol = 
     (
     SELECT SUM(othercol) 
     FROM othertable o 
     WHERE o.yetothercol = m.yetmycol 
     ) 

,在JOIN

在一般情況下,你可以在一個子查詢中使用聚合函數OracleSQL Server 2008):

MERGE 
INTO mycol 
USING (
     SELECT yetothercol, SUM(othercol) AS psum 
     FROM othertable 
     GROUP BY 
       yetothercol 
     ) s 
ON  (yetmycol = yetothercol) 
WHEN MATCHED THEN 
UPDATE 
SET  mycol = psum 
+0

我對第一個建議有疑問。如何確定子查詢的順序可以爲myco賦值?你在where子句中指定m.yetmycol(我想你的意思是mytable爲m)。你怎麼知道它是否會按照o.yetothercol或m.yetmycol的順序出現?它是可預測的嗎? (我覺得這不應該成爲另一個問題,但也許會更容易問一下。) – 2010-12-16 16:42:33

+0

@Etiennebr:「子查詢的順序」是什麼意思? – Quassnoi 2010-12-16 22:21:38

+0

好吧,我不確定這裏的術語,但包含連接的查詢看起來像一個子查詢(在UPDATE查詢中有一個SELECT查詢)。我想我自己已經回答了我的問題。該命令由o.yetothercol = m.yetmycol和m在第一個查詢之外的事實來保證。 – 2011-01-17 14:17:37