从0开始更新表中的列

时间:2018-10-03 08:58:14

标签: sql-server sql-server-2008

我有一个包含两个字段Idx1和Idx2的SQL Server文档表:

Idx1      Idx2
 0         23
 1         34
 2         12
 4          1
 5         21
 7         45
 8         50
 9          3 
10          9
...        ...

请注意,Idx1列中的数字是唯一的,永远不会重复。

现在我要重新编号从0开始的Idx1列,即0、1、2、3、4等。

预期结果应该是:

Idx1      Idx2
 0         23
 1         34
 2         12
 3          1
 4         21
 5         45
 6         50
 7          3 
 8          9
...        ...

我在下面尝试过,并且可以正常工作:

DECLARE @myVar int
SET @myVar = 0

UPDATE
  Docs
SET
  @myvar = Idx1 = @myVar + 1

但是我担心SQL Server以哪种顺序编号它们。我想先按照Idx1列对它们进行显式排序,然后再考虑到此顺序对其重新编号。

注意:我正在使用SQL Server 2008

2 个答案:

答案 0 :(得分:5)

没有必要玩弄变量。您可以进行子查询并在其中进行排序,以确保其遵循明确的顺序。有一种替代的,现代的方法,也可以在支持窗口功能的其他数据库引擎中使用。

使用SQL Server 2008提供的ROW_NUMBER窗口函数根据order by参数创建一个具有临时(用于查询运行)序列的列。然后从中减去1,使其从0开始。

UPDATE docs
SET idx1 = t.rn
FROM (
  SELECT idx1, row_number() over (order by idx1) - 1 as rn
  FROM docs
) t
WHERE docs.idx1 = t.idx1

答案 1 :(得分:2)

为什么不简单地使用row_number()函数:

with t as (
     select *, (row_number() over (order by idx1))-1 seq
     from docs
)

update t 
     set t.idx1 = t.seq
from t inner join
     docs t1
     on t1.idx1 = t.idx1;