我有一个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