Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在数据库中“上下”移动行(SQL查询帮助)_Sql - Fatal编程技术网

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

在数据库中“上下”移动行(SQL查询帮助),sql,Sql,在我希望能够“移动”行的表中,我有一个名为sortid的列,它在插入时自动比排序我的sortid desc时通过选择top value很容易找到的最高值高一个值 但是我有点困惑,我会使用什么查询来执行ASP.NET页面上每一行的“向上/向下”操作。我将使用什么查询来选择要移动的行正下方或上方的行 谢谢一个选项是在插入新行之前增加下面行的所有sortid字段。可以使用紧跟INSERT命令的UPDATE命令来完成此操作。假设在位置10插入一行。然后你可以这样做: UPDATE your_table

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

但是我有点困惑,我会使用什么查询来执行ASP.NET页面上每一行的“向上/向下”操作。我将使用什么查询来选择要移动的行正下方或上方的行


谢谢

一个选项是在插入新行之前增加下面行的所有sortid字段。可以使用紧跟INSERT命令的UPDATE命令来完成此操作。假设在位置10插入一行。然后你可以这样做:

UPDATE your_table SET sortid = sortid + 1 WHERE sortid >= 10;
INSERT INTO your_table (..., sortid) VALUES (..., 10);
您可能应该将其包装在一个容器中,以确保操作得以执行


至于向上/向下操作,您不希望执行插入操作。以上仅适用于在特定位置添加新行。对于向上/向下操作,您可以简单地交换两行的sortid值,如。

以获取目标行上方的行

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

对于下面的例子,只需使用将记录向上或向下移动是通过将其分别与之前或之后的记录交换来完成的

如果SortId值始终是连续的,即不删除会导致间隙的记录,则只需添加或减去一个即可获得下一条或上一条记录。如果不能保证记录是连续的,则必须在要移动的记录旁边找到该记录

要在之前查找记录的SortId,请执行以下操作:

select max(SortId) from TheTable where SortId < @SortId
要交换这两条记录,可以使用此技巧计算一个值与另一个值:

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