【问题标题】:How to SQL UPDATE in a certain order如何按特定顺序进行 SQL UPDATE
【发布时间】: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 是否可以发布您的代码,其中出现“语法错误”错误?

标签: sql sql-server tsql sql-update


【解决方案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”对我不起作用。我应该创建一个不同的例子来说明我的问题。谢谢。
  • 你应该给它检查以回答所述问题
  • 伊达尔戈。 . .如果您有不同的问题,您应该将其作为一个新问题提出(带有样本数据和期望的结果)。您不应该在评论中提出新问题。
猜你喜欢
  • 2020-11-05
  • 1970-01-01
  • 2020-12-18
  • 1970-01-01
  • 2016-11-01
  • 1970-01-01
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多