2011-04-19 55 views
4

想象有一個表:T-SQL UPDATE加入變量表

declare @tab table (id int, val int) 
insert into @tab(id, val) 
values (1,10),(2,20),(1,15) 

有必要更新表,併爲每個ID在同一ID的所有值的總和表

update @tab 
set val = (select sum(val) from @tab tab where tab.id = id) 

在其中,最後查詢的WHERE子句始終是真實的,因此,每一行會包含表中的所有值的總和。

如果表是真實的(不是表變量)我會使用表名稱引用它:

update realtab 
set val = (select sum(val) from @tab tab where tab.id = realtab.id) 

它有可能使對錶變量這樣的更新?

+0

「時間」 的意思是 「與時間做」;我認爲你的意思是「臨時」,但是「表變量」意味着無論如何。我編輯過。 – AakashM 2011-04-19 09:09:08

+0

@AakashM:當然,這是臨時變量 – Tim 2011-04-19 09:17:51

回答

5

嘗試使用UPDATE ... FROM

update t 
set val = (select sum(val) from @tab tab where tab.id = t.id) 
FROM @tab t 
1
UPDATE realtab 
SET  val = (select sum(val) from @tab tab where tab.id = realtab.id) 
FROM @tab realtab 

你也可以使用一個CTE

WITH q AS 
     (
     SELECT *, 
       SUM(val) OVER (PARTITION BY id) AS sum_val 
     FROM @tab 
     ) 
UPDATE q 
SET  val = sum_val