想象一下有一张桌子:
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)
可以对表变量进行这样的更新吗?
答案 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