0

この構造のテーブルがあります:

ID   NAME   RANK
10    A      1
11    A      2
12    A      3
13    A      4
14    B      1
15    B      2

このテーブルは巨大で、毎分約 500 行が挿入されます。各グループの名前順を維持するために、次のような before insert トリガーを使用しています。

begin

    SELECT NVL(MAX(RANK+1),1) INTO RANK FROM tablename
    WHERE NAME=:NEW.NAME;

end;

これはうまく機能しますが、(1,2,3,4,5 の代わりに (14,8,11,4,5) など) 間違った値を返すことがあります。コードを調査したため、このコラムは更新しませんでした。

何が問題なのですか?このランキング方法が間違っているとすれば、それを行うための最良の方法は何ですか?

4

1 に答える 1

1

私のコメントで述べたように、値が予想よりも高くなる理由はわかりません。したがって、元の質問に実際に答えることができません。

ただし、上記のコメントでも述べたように、代わりにシーケンスを使用することをお勧めします。シーケンスは同時アクセスで動作することが保証されていますが、あなたのアプローチはそうではありません。最後に連続した値を取得するには、集計関数を使用します。

select name, row_number() over (partition by name order by seq_no) as rank_no
from tablename; 

seq_no を非表示にして、rank_no のみを表示するビューを作成できます。したがって、クライアントは見たいものを手に入れることができます。

于 2013-11-09T09:20:38.833 に答える