2010-11-04 52 views
5

在表中,我希望能夠'移動'行,我有一個名爲sortid的列,它自動插入是一個高於最高值的值值(在排序我的sortid desc時通過選擇top值很容易找到)。在數據庫中向上和向下移動行(SQL查詢幫助)

但是我對我在ASP.NET頁面上每行的'up/down'動作使用什麼查詢有點困惑。我將使用什麼查詢來選擇要移動的行的「下方」或「上方」的行?

感謝

回答

7

向上或向下移動記錄是通過分別在記錄之前或之後交換記錄來完成的。

如果SortId值始終是連續的(即,您不刪除會導致間隙的記錄),那麼您可以只添加或減去一個記錄以獲取下一條或上一條記錄。如果記錄不能保證連續,則必須在要移動的記錄旁找到記錄。

來查找記錄的前SortId

select max(SortId) from TheTable where SortId < @SortId 

要查找的記錄後SortId

select min(SortId) from TheTable where SortId > @SortId 

交換兩個記錄,你可以使用這一招,計算一個從另一個值:

update TheTable 
set SortId = @SortId1 + @SortId2 - SortId 
where SortId in (@SortId1, @SortId2) 
+0

我喜歡你的解決方案 – kta 2012-09-07 15:28:43

3

一種選擇是增加所有「以下」之前INSERT行荷蘭國際集團新行的sortid領域。您可以通過UPDATE命令立即執行此操作,然後執行INSERT命令。比方說,你在位置10中插入一行然後,你可以做這樣的事情:

UPDATE your_table SET sortid = sortid + 1 WHERE sortid >= 10; 
INSERT INTO your_table (..., sortid) VALUES (..., 10); 

你或許應該換行了一個transaction,以確保操作進行atomically

至於上/下行動,你不會想做INSERT。以上僅適用於在特定「位置」添加新行行。對於向上/向下操作,您可以簡單地「交換」兩行的sortid值,如@Guffa suggested in the other answer

1

用於獲取目標行上方的行。

select * from [TableName] 
where sortid > (select sortid from [TableName] 
       where id = @id) 

對於下面的那些,只需使用<來代替。