重新排序SQL位置列

时间:2011-12-28 01:36:09

标签: sql sql-server

我有一个带有位置列的待办事项表。 (为简单起见,删除了其他列)

Description varchar(max)
Position int
JobFinished bit

如果我有n行,每次添加一行时,位置会递增。因此,值可能如下所示:

Drop Off Kids,   0, 0 
Get Groceries,   1, 0 
Pickup Kids,     2, 0

现在,如果我做某事我想从表中删除它。并递增所有其他位置列,使它们从0开始按顺序排列。

即如果我获得Groceries,我需要将值看起来像这样:

Drop off Kids,  0,    0
Get Grocerieis, NULL, 1
Pickup Kids,    1,    0

有没有办法用SQL我能做到这一点? (我使用SQL服务器)

4 个答案:

答案 0 :(得分:1)

这是一个非常简单的SQL问题,只需检查你的sql server引用,以获取更新SQL语句:

update todo_table set position = position -1 where position > 1;
update todo_table set position = NULL, JobFinished = 1 where Description='Get Grocerieis'

答案 1 :(得分:1)

假设负增量是唯一的问题,而不是重新安排,并且你有办法“分组”你的套装..那么

update toDO set position = position -1 where position > @recordDeletedPosition and GroupingMethod = something

答案 2 :(得分:0)

虽然看起来设计不好,但您可以使用ROW_NUMBER函数尝试此解决方案(SQL Server 2005 +)

DECLARE @tbl table(i int)

INSERT INTO @tbl VALUES (0),(null),(2),(null),(null),(5)

UPDATE n
SET i=rn-1
FROM (SELECT i,ROW_NUMBER() OVER(ORDER BY i) rn
      FROM @tbl
      WHERE not i is null) n




SELECT *  FROM @tbl 

答案 3 :(得分:0)

with cte as (
   select Position, row_number() over (order by position) - 1 as NewPosition
   from tbl
   where JobFinished = 0
)
update tbl
set Position = NewPosition