1

現在、テーブル構造とデータは次のようになっています。

Name      record_number        Area
a         1                    CN
a         3                    DE
a         4                    FR
a         6                    DE
b         1                    DE
b         2                    CN

主キーは (name, record_number) です

record_nubmer は max(record_number) + 1 によって生成されました。record_number = 2/5 および name = 'a' によって削除された 2 つのレコードがあると仮定してください。削除後に上記の表の record_nubmer ギャップを削除する方法を教えてください。最終結果は次のようになります。

Name      record_number        Area
a         1                    CN
a         2                    DE
a         3                    FR
a         4                    DE
b         1                    DE
b         2                    CN
4

2 に答える 2

0

delete次のようなコマンドでレコードを更新できます。

update my_table set record_number = record_number - 1
where name = :old.name and record_number > :old.record_number

このトリガーを作成できるかどうかわかりません (そして、今は Oracle デプロイメントにアクセスできません)。

そのようなトリガーを(各行を削除した後)作成してみてください。そうでない場合は、アプリケーションを更新して、各削除後に上記のクエリが実行されるようにします。

別の解決策は、次のクエリを実行することです。

select name, record_number, rank() over (partition by name order by record_number) new_record_number
  from my_table

結果を繰り返し処理し、次を実行します。

update my_table
   set record_number = :new_record_number
 where name = :name and
       record_number = :record_number

全体がストアド プロシージャになり、各削除コマンドの後に呼び出すことができます。

于 2013-10-28T05:00:24.060 に答える
0

@AmirPashazadeh の に触発されたrank()、ここに一行の解決策があります:

UPDATE my_table t3
  SET record_number=(SELECT
   t2.rank
   FROM my_table t1
   INNER JOIN (SELECT
    name,
    record_number,
    rank() over (partition by name ORDER BY record_number) rank
    FROM my_table) t2 ON (t1.name=t2.name AND t1.record_number=t2.record_number)
   WHERE t1.name=t3.name AND t1.record_number=t3.record_number);

SQL フィドルのデモ

于 2013-10-28T05:31:21.050 に答える