【发布时间】:2025-12-30 00:30:15
【问题描述】:
您好,我想将一列更新为一些可以在更新期间更改的值。例如
1: select * into #TempTable from (values ('a', 1), ('b', 1)) t (code, num)
2: select * from #TempTable
3: update tt set tt.code = 'b', tt.num = (
select max(oo.num) + 1 from #TempTable oo where oo.code = 'b')
from #TempTable tt
4: select * from #TempTable
5: drop table #TempTable
语句2的输出:是
code num
---- ---
a 1
b 1
和陈述4:是
code num
---- ---
b 2
b 2
似乎 UPDATE 语句是静态的,导致 'b' 和 num 2。我真正想要实现的是列 num 将在整个 UPDATE 语句中更改其值,即对于语句 4:我希望输出为
code num
---- ---
b 2
b 3
您如何编写查询来实现这一点?我想避免使用游标,因此将选择不依赖游标的答案。如果没有光标是不可能的,那么只有带有光标的答案才会被选中。谢谢。
【问题讨论】:
-
如果没有游标作为一般要求,这是不可能的。从概念上讲,SQL 更新“一次”发生。 “万圣节保护”的概念就是要确保这在现实世界的执行计划中不会发生。对于某些特定类型的要求 - 例如运行总计,但是可以使用窗口函数得到相同的结果。
标签: sql-server sql-server-2008 sql-server-2012