对表变量使用自联接的T-SQL UPDATE

时间:2011-04-19 08:58:09

标签: sql-server sql-server-2008 tsql 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子句始终为true,因此每一行都包含表中所有值的总和。

如果表是真的(不是表变量),我会使用表名引用它:

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

可以对表变量进行这样的更新吗?

2 个答案:

答案 0 :(得分:5)

尝试使用UPDATE ... FROM

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

答案 1 :(得分: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