SQL:重新排序列表顺序

时间:2013-04-06 22:28:36

标签: sql tsql

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

我希望能够重新排列列表的顺序。我需要这样做的原因是因为如果我删除一个表单选项,那么它将是乱序的..即(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

3 个答案:

答案 0 :(得分:2)

我猜你正在研究一些需要允许从有序列表中删除并插入特定位置的有序列表的东西。删除不需要使订单密集,但可以完成:

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 )

可以编写类似的update来在订单中的一个位置向上或向下移动单个表单选项。

答案 1 :(得分:0)

我建议单独留下OrderId,因为@OldProgrammer已经说它们仍然有序,加上(除非我遗漏了什么)它似乎会增加不必要的开销。

如果你真的想要连续数字,大概是出于演示目的,那么要么将其推送到表示层,要么创建一个类似

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

答案 2 :(得分:0)

我建议不要使用计数来订购。在过去,我根据用户决定的内容订购了多列。

快速解决问题的一个选择是提供orderID> Max(orderID)通过这种方式,您可以确保每个新商品都获得orderID>与最高值无关,无论列表中的项目数量多少。

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

有时候考虑如何改变你正在做的事情更容易(也更好),而不是代码来做你的想法:)