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
...        ...
请注意,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
没有必要玩变量.您可以创建一个子查询并在其中应用排序,以确保它遵循显式顺序.还有另一种现代方法,它也适用于支持窗口功能的其他数据库引擎.
使用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
| 归档时间: | 
 | 
| 查看次数: | 45 次 | 
| 最近记录: |