我正在使用Oracle 11g。排名不是静态的。它们会根据用户对项目的排名进行更改。
我想使用Rank(1-10)列和对象的ID来保持排名1-10的实时记录。这样用户就可以不断评价对象的集合,并且排名保持正确。我发现下面有一个不错的解决方法,但存在差距问题:
// REMOVAL
UPDATE ... SET orderingID=NULL WHERE orderingID=removedID
UPDATE ... SET orderingID=orderingID-1 WHERE orderingID > removedID
// INSERTION
UPDATE ... SET orderingID=orderingID+1 WHERE orderingID > insertionID
UPDATE ... SET orderID=insertionID WHERE ID=addedID
如果我有这样一张桌子:
RANK | OBJECT
1 | AA
6 | BB
使用上面的算法,我遇到了数字缺口的问题。例如,如果我插入2我得到:
RANK | OBJECT
1 | AA
2 | DD
7 | BB
当它应该保持在6时,6变为7。有没有办法在SQL中使用更新语句或存储过程来执行此操作?