2011-12-28 64 views
0

我有一個位置列的TO DO表。 (爲簡單起見除去其它列)重新排序SQL位置列

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什麼辦法能做到這一點? (IM使用SQL Server)

+0

類似:http://stackoverflow.com/questions/8607998/using-a-sort-order-column-in-a-database-table/8608085#8608085 – xQbert 2011-12-28 01:45:59

回答

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' 
+0

嗨,但這並不總是奏效。如果有10個項目,並且我移除位置8處的項目,然後運行此查詢。這將影響所有的項目8.但我已經意識到我可以做更新Tablre設置位置=位置 - 1位置>(位置將被刪除)..現在我想起它是一個很簡單的。謝謝 – michael 2011-12-28 01:52:14

1

假設負增量是唯一的問題,而不是重新排列而且你有辦法「集團」你的套..然後

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

0

雖然它看起來像一個糟糕的設計,你可以嘗試用ROW_NUMBER功能該解決方案(SQL即成R 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 
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