假设我有一张海龟桌。我跑的时候
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
无论表中有多少只海龟,无论有多少空隙或每个空隙有多长,这都应该有效。
答案 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