我有一个包含两个字段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
答案 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;