我有一个带有位置列的待办事项表。 (为简单起见,删除了其他列)
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服务器)
答案 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