在数据库中上下移动行(SQL查询帮助)

时间:2010-11-04 21:20:07

标签: sql

在表格中我希望能够“移动”行,我有一个名为sortid的列,它在插入时自动是一个高于最高值的值(通过在排序我的sortid desc时选择最高值很容易找到)。

但我对我在ASP.NET页面上每行的'up / down'操作使用的查询有点困惑。我将使用什么查询来选择要移动的行的“下方”或“上方”的行?

由于

3 个答案:

答案 0 :(得分:8)

通过分别在之前或之后交换记录来完成向上或向下移动记录。

如果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)

答案 1 :(得分:3)

一个选项是在sortid新行之前递增“下面”行的所有INSERT字段。您可以使用UPDATE命令立即执行此操作,然后执行INSERT命令。假设您在第10位插入一行。然后您可以执行以下操作:

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

您应该将其包含在transaction中以确保执行操作atomically

对于上/下操作,您不希望执行INSERT。以上内容仅适用于在特定“位置”添加 new 行。对于向上/向下操作,您只需“交换”两行的sortid值,即@Guffa suggested in the other answer

答案 2 :(得分:1)

用于获取目标行上方的行。

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

对于以下内容,请改用<