如何按特定顺序进行 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的主要内容,如果未能解决你的问题,请参考以下文章

如何按特定顺序对猫鼬进行排序?

如何按特定顺序对 .then() 调用进行排序? [复制]

如何使用python按特定顺序对文件名进行排序

如何让 Jest 按特定顺序运行测试?

如何对大量 csv 文件进行排序以按特定顺序读取它们?

如何按数字顺序对字母数字 SQL Server NVARCHAR 列进行排序?