重新排序SQL位置列



我有一个TO DO表与位置列。(为了简单起见,删除了其他列)

Description varchar(max)
Position int
JobFinished bit

如果我有n行,每增加一行,位置递增。所以值可能像这样:

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

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

例如,如果我得到杂货,我需要值看起来像这样:

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

是否有任何方法与SQL我可以做到这一点?(我使用SQL server)

这是一个非常简单的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'

假设唯一关心的是负增量,而不是重新排列,并且您有办法"分组"您的集合。

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

虽然它看起来像一个糟糕的设计,你可以尝试这个解决方案与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 
with cte as (
   select Position, row_number() over (order by position) - 1 as NewPosition
   from tbl
   where JobFinished = 0
)
update tbl
set Position = NewPosition

最新更新