从0开始从表更新列

use*_*552 1 sql-server sql-server-2008

我有一个SQL Server Docs表,有两个字段,Idx1和Idx2:

Idx1      Idx2
 0         23
 1         34
 2         12
 4          1
 5         21
 7         45
 8         50
 9          3 
10          9
...        ...
Run Code Online (Sandbox Code Playgroud)

请注意,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
...        ...
Run Code Online (Sandbox Code Playgroud)

我在下面尝试了它的工作原理:

DECLARE @myVar int
SET @myVar = 0

UPDATE
  Docs
SET
  @myvar = Idx1 = @myVar + 1
Run Code Online (Sandbox Code Playgroud)

但我担心SQL Server将它们编号为哪个顺序.我想首先通过Idx1列明确订购它们,然后考虑到这个订单重新编号.

注意:我使用的是SQL Server 2008

Kam*_*ski 5

没有必要玩变量.您可以创建一个子查询并在其中应用排序,以确保它遵循显式顺序.还有另一种现代方法,它也适用于支持窗口功能的其他数据库引擎.

使用ROW_NUMBERSQL Server 2008提供的窗口函数创建一个基于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
Run Code Online (Sandbox Code Playgroud)