如何关闭SQL Server中的序列间隙?

时间:2016-01-26 19:27:18

标签: sql-server

假设我有一张海龟桌。我跑的时候

SELECT * FROM Turtle ORDER BY Sort

我明白了:

Id | Name | Sort
2    Leo    1
3    Raph   2
4    Don    5
1    Mike   7

缩小Raph和Don之间以及Don和Mike之间的差距的最简单方法是什么,以便表格看起来像这样?

Id | Name | Sort
2    Leo    1
3    Raph   2
4    Don    3
1    Mike   4

无论表中有多少只海龟,无论有多少空隙或每个空隙有多长,这都应该有效。

4 个答案:

答案 0 :(得分:3)

您可以使用带有row_number()的CTE进行更新,然后只需更新CTE:

;with CTE as (
  select *, row_number () over (order by Sort) as RN
  from Turtle
)

update CTE
set Sort = RN

答案 1 :(得分:2)

试试这个

SELECT ID, Name, ROW_NUMBER() OVER(ORDER BY Sort) AS Sort FROM Turtle

答案 2 :(得分:1)

以下是我提出的答案:

UPDATE t
SET t.Sort = t2.Sort
FROM Turtle AS t,
(SELECT Id, Sort = ROW_NUMBER() OVER(ORDER BY Sort) FROM Turtle) as t2
WHERE t.Id = t2.Id

我们可以选择Turtle表作为t2,按排序列对海龟进行排序,但是将ROW_NUMBER()指定给Sort列。然后我们可以使用t2.Sort中的新值来更新Ids匹配的Turtle表中的每一行。

编辑(基于Juan Carlos Oropeza的反馈):

以下是使用显式JOIN的代码。

UPDATE t
SET t.Sort = t2.Sort
FROM Turtle AS t
JOIN (SELECT Id, ROW_NUMBER() OVER(ORDER BY Sort) AS Sort FROM Turtle) AS t2 ON t.Id = t2.Id

答案 3 :(得分:0)

这就是他们在更新中使用cte的意思。

;WITH cte AS 
(
    SELECT *, ROW_NUMBER() OVER(ORDER BY Sort) NewSort 
    FROM Turtle
)
UPDATE cte SET Sort = NewSort