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