如何按特定顺序进行 SQL UPDATE
Posted
技术标签:
【中文标题】如何按特定顺序进行 SQL UPDATE【英文标题】:How to SQL UPDATE in a certain order 【发布时间】:2015-03-08 14:24:21 【问题描述】:我想了解如何在更新列时按特定顺序(而不是随机或按创建记录的顺序)处理表行。
为了说明我的问题,在下面的虚构示例中,我想根据 date_time 设置排名,以便首先处理较旧的记录(并获得较低的排名)。
create table #testTable (customer_id char(20), ranking int, date_time
Datetime, pk_value int identity )
go
insert into #testTable (customer_id, date_time) values
('MICROSOFT', '20110202')
insert into #testTable (customer_id, date_time) values
('MICROSOFT', '20120202')
insert into #testTable (customer_id, date_time) values
('MICROSOFT', '20090512')
go
declare @Rank int
set @Rank = 0
update #testTable set @Rank = @Rank + 1, ranking = @Rank
【问题讨论】:
您应该使用您正在使用的数据库标记您的问题。从语法上,我推测是SQL Server。 你总是可以做UPDATE table SET column="value" WHERE foo = bar ORDER BY any_column;
@GordonLinoff 是的,你是对的,我的意思是 SQL Server。下次我会做的。
@IfediOkonkwo 感谢您的建议。当我尝试您的语法时,我收到错误“ORDER 附近的语法不正确”
@Hidalgo 是否可以发布您的代码,其中出现“语法错误”错误?
【参考方案1】:
看起来您正在使用 SQL Server。如果是这样,您可以使用(适当命名的)排名函数设置排名:
with toupdate as (
select t.*, row_number() over (order by date_time) as seqnum
from #testtable t
)
update toupdate
set ranking = seqnum;
【讨论】:
戈登,我将不得不学习理解你的代码(对我来说是新语法)。谢谢你的建议。 Gordon,你的表达中包含“t.*”的目的或原因是什么? 您使用 row_number() 的答案很有帮助(我学到了一些新东西)。它回答了我用来说明它的例子的问题。但是我的实际更新更复杂,我需要更新的不是“排名”列,而是一些数量列。并且必须按照一定的顺序进行。所以使用“seqnum”对我不起作用。我应该创建一个不同的例子来说明我的问题。谢谢。 你应该给它检查以回答所述问题 伊达尔戈。 . .如果您有不同的问题,您应该将其作为一个新问题提出(带有样本数据和期望的结果)。您不应该在评论中提出新问题。以上是关于如何按特定顺序进行 SQL UPDATE的主要内容,如果未能解决你的问题,请参考以下文章