在SQL Server 2008中,我有一个表"Q"的人在FIFO队列:
Person Position
23 1
49 5
108 2
. .
. .
当然,我可以使用
来查看队列 SELECT * FROM Q ORDER BY Position
我需要能够在队列中上下移动人们。我知道我可以在一个存储过程中使用RBAR来完成它,但是如果可能的话,我希望能够在单个查询中完成它。要求是
move person 'x' to position y
。将"x"移到y位置的人前面,并将该人和所有人移到后面一个
算法为:
- 查找'x'的位置#
- 对于每个位置>= 'y'的人('x'除外)增加一个
- 设置'x'的位置为y。
有这样的查询吗?
您有几个选择:
- 链表(
Id
,PrevId
),但Position
现在是每次操作需要计算或重新计算的东西 - 双链表(
Id
,PrevId
,NextId
);同上 -
position
作为float
,当插入发生时,新的position
计算为前一个位置和下一个位置的平均值;但最终你会耗尽精度,所以你必须通过更均匀地重新分配值来维持它