如何在SQL Server 2012中添加行号列

20

我正在尝试向现有表格添加新列,其中该值为行号/排名。我需要一种方法来生成行号/排名值,并且我还需要限制受影响的行--在这种情况下,是一个字符串中包含子字符串的情况。

目前我的代码:

UPDATE table
SET row_id=ROW_NUMBER() OVER (ORDER BY col1 desc) FROM table
WHERE CHARINDEX('2009',col2) > 0

然后我收到了这个错误:

Windowed functions can only appear in the SELECT or ORDER BY clauses.

RANK() 函数出现相同错误)

有没有办法使用 ROW_NUMBER() 函数创建/更新列?请注意,这是为了替换不正确但已经存在的“排名”列。


你能否包含你的表中有哪些列,至少是你计划排序、搜索和更新的列? - dcaswell
3个回答

33

你可以使用CTE(通用表达式)来完成这个操作,类似于:

with cte as
(
  select *
    , new_row_id=ROW_NUMBER() OVER (ORDER BY col1 desc)
  from MyTable
  where charindex('2009',col2) > 0
)
update cte
set row_id = new_row_id

使用演示的SQL Fiddle


1
如果你只需要更新几千行数据,可以尝试以下方法:
select 'UPDATE MyTable SET ID = ' + CAST(RowID as varchar) + ' WHERE ID = ' + CAST(ID as varchar)
From (
select MyTable, ROW_NUMBER() OVER (ORDER BY SortColumn) RowID from RaceEntry 
where SomeClause and SomeOtherClause
) tbl

将查询结果复制并粘贴到查询编辑器中,然后运行。它有点缓慢和糟糕,但它能工作。

-1

一个简单的解决方法是创建一个类似于以下结构的临时表:

CREATE TABLE #temp (id int, rank int)

其中,id 是与你主表中的主键相同类型的字段。

使用 SELECT INTO 语句将数据先填充到临时表中,然后再从临时表更新数据即可...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接