更改行的排序顺序后如何重新排列“排序顺序”列

5 sql t-sql sql-server sorting

我有一个包含多行的表和一个名为“order”的列,该列从 1 到 XX 取决于我的表中有多少行。

问题是,如果我想将“顺序”1 的行移动到位置 3,我需要其他行中的另一个“顺序”来重新排列它们自己。

例如,如果我用“3”移动“order”1,则后面的所有数字都必须增加1,而第二个现在必须是“order”1。

我希望我说清楚了。

感谢您的帮助 !

编辑/样本数据

Name   |  Order
Line 1 |  1
Line 2 |  2
Line 3 |  3
Line 4 |  4
Run Code Online (Sandbox Code Playgroud)

如果我用 4 而不是 1 更新“第 1 行”的顺序,我希望其他人也更新他们的顺序!

Name   |  Order
Line 2 |  1
Line 3 |  2
Line 4 |  3
Line 1 |  4
Run Code Online (Sandbox Code Playgroud)

如果我用 1 更新“第 4 行”的顺序,也会发生同样的情况!

Name   |  Order
Line 4 |  1
Line 1 |  2
Line 2 |  3
Line 3 |  4
Run Code Online (Sandbox Code Playgroud)

例如,如果我用 2 更新“第 3 行”的顺序,也会发生同样的情况!

Name   |  Order
Line 1 |  1
Line 3 |  2
Line 2 |  3
Line 4 |  4
Run Code Online (Sandbox Code Playgroud)

Sal*_*n A 3

您可以使用一个CASE声明:

UPDATE ...
SET [Order] = [Order] + CASE
  WHEN [Order] = @OLDPOS THEN @NEWPOS - @OLDPOS
  WHEN @NEWPOS > @OLDPOS AND [Order] > @OLDPOS AND [Order] <= @NEWPOS THEN -1
  WHEN @NEWPOS < @OLDPOS AND [Order] < @OLDPOS AND [Order] >= @NEWPOS THEN 1
  ELSE 0
END
Run Code Online (Sandbox Code Playgroud)

这是一些测试

ROW_NUMBER()间隙和重叠可以通过添加上述内容来修复。

一些摩尔测试