我有一个具有这种结构的表:
ID NAME RANK
10 A 1
11 A 2
12 A 3
13 A 4
14 B 1
15 B 2
此表非常庞大,每分钟大约插入500行。为了按名称维护每个组的排序,我们使用如下插入触发器:
begin
SELECT NVL(MAX(RANK+1),1) INTO RANK FROM tablename
WHERE NAME=:NEW.NAME;
end;
这很有效但有时会返回不正确的值,例如(14,8,11,4,5)而不是(1,2,3,4,5)。我们调查了我们的代码,因此我们没有更新此列。
可能是什么问题?如果这种排名方法是错误的,那么最好的方法是什么?
答案 0 :(得分:1)
正如我的评论所述,我认为没有理由让价值高于预期。所以我实际上无法回答你原来的问题。
但是,我建议您使用序列,如上面的评论中所述。保证序列可以与并发访问一起使用,而您的方法则不然。要获得最后连续的值,您可以使用聚合函数:
select name, row_number() over (partition by name order by seq_no) as rank_no
from tablename;
您可以创建视图,隐藏seq_no并仅显示rank_no。因此,您的客户得到了他们想要看到的东西。