【问题标题】:How to UPDATE table with changing values如何使用更改的值更新表
【发布时间】: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


【解决方案1】:
;WITH CTE AS (
SELECT Code 
     , Num
     , Num + ROW_NUMBER() OVER (ORDER BY Num ASC) rn
FROM #TempTable )
UPDATE CTE 
  SET Code = 'b'
     ,Num = rn

【讨论】:

  • 对不起,我把你的代码放在我上面的例子中它仍然给出了两个'b',2
  • 立即尝试@user1589188(不要对试图帮助你的人投反对票,你应该帮助他们提供适当的反馈和更多信息来帮助你)
  • 感谢您的尝试,但您的回答是人为的,您把我的问题弄错了。您只需预先选择 2 和 3 并将 num 列更新为 2 和 3。我的问题是关于将列更新为在整个更新过程中不断变化的值。