我在sql server中有一个名为" Ordinal"用于指示行的显示顺序。它从0开始,向下一行跳过10。所以我们有这样的事情:
Id Ordinal
1 0
2 20
3 10
它跳过10,因为我们希望能够在项目之间移动项目(基于序数),而不必为整个表格重新分配序号。
正如您最终可以想象的那样,序号需要以某种方式重新分配,以便在周围行或整个表之间进行操作,因为目标项之间未使用的序号都已用完。
是否有任何算法可以用来有效地重新排序考虑中的移动操作的序号,如表的长期可维护性和最小化表的更新操作?
答案 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
现在序列号再次均匀分布,因此您可以继续插入中间,直到用完新的序列号;然后你可以再次重新编号。
答案 1 :(得分:1)
这些不会直接回答你的问题 - 我只是想我可能会建议其他方法:
一种可能性 - 不要试图手工完成。让您的软件管理数字。如果他们需要重写,只需用新号码保存即可。
第二个 - 改为使用“链接列表”。在每个记录存储中,您希望显示的下一条记录的索引,然后将您的代码直接加载到链接列表中。
答案 2 :(得分:1)
又一种简单的方法。我们假设您要插入ordinal
等于x
的新记录。
首先,检查ordinal
值是否等于x
的行。如果有的话,只需更新ordinal
值等于或大于x
的所有记录,将y
增加update
。然后,您可以安全地插入新记录。
通过这种方式,您确定每次都不会运行{{1}}当然,您将保留订单。