Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.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_Tsql - Fatal编程技术网

SQL:重新排序列表顺序

SQL:重新排序列表顺序,sql,tsql,Sql,Tsql,我想在一个表格行中循环。。通过将OrderID设置为@NUMCOUNT来对我的“表单选项”重新排序 我希望能够重新排列列表的顺序。我之所以需要这样做,是因为如果我删除一个表单选项,那么它将出现故障。。i、 e(1,2,3,5)。。我想要(1,2,3,4)。。等等 示例表: ID OrderID FormOption 1 1姓名 2 3地址2 3 2地址1 DECLARE @NUMCOUNT int SET @NUMCOUNT = 0 WHILE (SELECT Count(OrderID) FR

我想在一个表格行中循环。。通过将OrderID设置为@NUMCOUNT来对我的“表单选项”重新排序

我希望能够重新排列列表的顺序。我之所以需要这样做,是因为如果我删除一个表单选项,那么它将出现故障。。i、 e(1,2,3,5)。。我想要(1,2,3,4)。。等等

示例表:

ID OrderID FormOption

1 1姓名

2 3地址2

3 2地址1

DECLARE @NUMCOUNT int
SET @NUMCOUNT = 0
WHILE (SELECT Count(OrderID) FROM FormOptions WHERE ProductID=1) > @NUMCOUNT
BEGIN
   SET @NUMCOUNT = @NUMCOUNT + 1
   PRINT 'The count is ' + CAST(@NUMCOUNT as char)
   UPDATE FormOptions SET OrderID = @NUMCOUNT WHERE ID=????
END

我建议把OrderId放在一边,因为@OldProgrammer已经说过它们仍然是有序的,另外(除非我遗漏了什么),这似乎会增加不必要的开销

如果你真的想拥有连续的数字,大概是为了展示的目的,那么要么把它推到展示层,要么创建一个视图,这样做

SELECT 
    ROW_NUMBER() AS OrderNumber
    , OtherColumn
FROM FormOptions 
ORDER BY OrderID 

我建议不要在订购时使用计数。在过去,我有多个专栏根据用户的决定进行排序

快速解决此问题的一个选项是提供orderID>Max(orderID),这样您就可以确保每个新项目获得的orderID>大于最大值,而不考虑列表中的项目数

然后,您可以有一个列用于排序目的,并允许用户设置事物的顺序


有时候,想一想如何改变你正在做的事情会更容易(也更好),而不是按照你的想法编写代码:)

我猜你正在做一些事情,需要允许从有序列表中删除并在特定位置插入有序列表。删除不需要使订单密集,但可以通过以下方式完成:

delete from FormOptions
  where OrderId = @SelectedFormOption
update FormOptions
  set OrderId = OrderId - 1
  where OrderId > @SelectedFormOption
您可能希望将其包装到事务中。(确保您了解交易,因为这非常重要。)

插入与此类似:

update FormOptions
  set OrderId = OrderId + 1
  where OrderId >= @TargetOrderId
insert into FormOptions
  ( OrderId, ... ) values ( @TargetOrderId, ... )
交换订单位置可以在一次更新中自动完成:

 update FormOptions
   set OrderId = case when OrderId = @TargetA then @TargetB else @TargetB end
   where OrderId in ( @TargetA, @TargetB )

可以编写类似的
更新
,将单个表单选项在订单中上移或下移一个位置。

不理解1,2,3,5仍然是订单。是否要将所有orderID值重新分配为连续?通过“SQL”您是指“Transact-SQL”吗?是!T-SQL。。。事情是。。当我添加项目时。。这很重要。。。所以我有4。。然后它添加到这个列表中,有2个5。。所以我想对列表进行重新排序。TSQL表示Sybase或SQL Server—您使用的是哪种,具体是哪个版本?您所说的“它很重要”是什么意思?如果插入两个5,它将只有两个5。需要表定义、insert语句和delete语句。ID OrderID FormOption 1名称2 3地址2 3地址1从何处、何时和如何搜索列表。例如,如果我将项目设置为8,将项目设置为4,他们是切换位置还是全部“下移”一个?一次只移动一个项目吗?当您添加一个项目而不是使用
COUNT+1
时,为什么不使用
MAX+1
?不确定为什么这不是公认的答案,因为它不仅提供了答案,而且还提供了位置互换的解决方案,而大多数情况下可能只需要少量更新而不是单个更新。