重新分配移动操作的序号的最佳方法是什么

时间:2014-08-19 18:04:46

标签: sql algorithm

我在sql server中有一个名为" Ordinal"用于指示行的显示顺序。它从0开始,向下一行跳过10。所以我们有这样的事情:

Id  Ordinal
1    0
2    20
3    10

它跳过10,因为我们希望能够在项目之间移动项目(基于序数),而不必为整个表格重新分配序号。

正如您最终可以想象的那样,序号需要以某种方式重新分配,以便在周围行或整个表之间进行操作,因为目标项之间未使用的序号都已用完。

是否有任何算法可以用来有效地重新排序考虑中的移动操作的序号,如表的长期可维护性和最小化表的更新操作?

3 个答案:

答案 0 :(得分:2)

您可以使用稍微复杂的UPDATE语句重新编号序列:

UPDATE u
SET u.sequence = 10 * (c.num_below-1)
FROM test u
JOIN (
  SELECT t.id, count(*) AS num_below
  FROM test t
  JOIN test tr ON tr.sequence <= t.sequence
  GROUP BY t.id
) c ON c.id=u.id

我们的想法是获取sequence 低于的项目数,而不是当前行的数量,将计数乘以10,并将其指定为新计数。

test之前UPDATE的内容:

ID  Sequence
__  ________
 1   0
 2  10
 3  20
 4  12

test之后UPDATE的内容:

ID  Sequence
__  ________
 1   0
 2  30
 3  10
 4  20

现在序列号再次均匀分布,因此您可以继续插入中间,直到用完新的序列号;然后你可以再次重新编号。

Demo.

答案 1 :(得分:1)

这些不会直接回答你的问题 - 我只是想我可能会建议其他方法:

一种可能性 - 不要试图手工完成。让您的软件管理数字。如果他们需要重写,只需用新号码保存即可。

第二个 - 改为使用“链接列表”。在每个记录存储中,您希望显示的下一条记录的索引,然后将您的代码直接加载到链接列表中。

答案 2 :(得分:1)

又一种简单的方法。我们假设您要插入ordinal等于x的新记录。

首先,检查ordinal值是否等于x的行。如果有的话,只需更新ordinal值等于或大于x的所有记录,将y增加update。然后,您可以安全地插入新记录。

通过这种方式,您确定每次都不会运行{{1}}当然,您将保留订单。