在表格中我希望能够“移动”行,我有一个名为sortid的列,它在插入时自动是一个高于最高值的值(通过在排序我的sortid desc时选择最高值很容易找到)。
但我对我在ASP.NET页面上每行的'up / down'操作使用的查询有点困惑。我将使用什么查询来选择要移动的行的“下方”或“上方”的行?
由于
答案 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)
对于以下内容,请改用<
。