2010-11-04 35 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) 

对于下面的那些,只需使用<来代替。