在表中,我希望能够“移动”行。我有一个名为sortid
的列,它在插入时自动比最高值高一个值(通过在对sortid desc排序时选择top值很容易找到)。
但是我有点困惑,我不知道该用什么查询来为我的ASP.NET页面上的每一行执行“向上/向下”操作。我将使用什么查询来选择紧邻要移动的行的“下方”或“上方”行?
发布于 2010-11-04 21:30:01
向上或向下移动记录是通过分别在记录之前或之后与记录交换来完成的。
如果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)
发布于 2010-11-04 21:25:20
一种选择是在对新行执行INSERT
操作之前递增“下面”行的所有sortid
字段。您可以使用紧跟在INSERT
命令之后的UPDATE
命令来完成此操作。假设你在位置10插入一行,然后你可以这样做:
UPDATE your_table SET sortid = sortid + 1 WHERE sortid >= 10;
INSERT INTO your_table (..., sortid) VALUES (..., 10);
您可能应该将其包装在transaction中,以确保操作是在atomically中执行的。
至于up/down操作,您不会想要执行INSERT
。上面的代码只适用于在特定的“位置”添加新行。对于向上/向下操作,您可以简单地将两行的sortid
值“交换”为@Guffa suggested in the other answer。
发布于 2010-11-04 21:28:08
用于获取目标行上方的行。
select * from [TableName]
where sortid > (select sortid from [TableName]
where id = @id)
对于下面的,只需使用<
即可。
https://stackoverflow.com/questions/4101513
复制相似问题