1

次のようなすべてのユーザーのメモで構成されるテーブルがあります。

user_id    note_id
-------    -------
      1       1232
      1       1246
      1       1223
      2       3342
      2       2134
      3       3212
      3       1243
    ...        ...

そして今、私は、ファイナルテーブルが次のようになるように、ユーザーがこれらのメモをユーザー指定の方法で配置できるようにする順序付けメカニズムを実装したいと思います。

user_id    note_id  note_order
-------    -------  ----------
      1       1232          1
      1       1246          2
      1       1223          3
      2       3342          1
      2       2134          2
      3       3212          1
      3       1243          2
    ...        ...        ...

もちろん、この列を追加した後はNULL値になり、データベースにこれ以上シーケンスを作成することはできません。ORACLEにこの目標を達成する方法はありますか?

順序列の値を1からすべてのユーザーのメモの数まで開始し、できれば1つの更新ステートメントでこれを実行するようにします。この方法が不可能な場合、PL / SQLループの最適な構成は何でしょうか。それとも、これを行うための他の効果的な方法はありますか。

可能な限りの助けを楽しみにしています。

4

1 に答える 1

5

この値を保存する必要はありません。取得時にこれを生成するだけです。

select user_id,
       note_id,
       row_number() over (partition by user_id order by note_id)
from your_table

本当にテーブルを更新する必要がある場合は、次のようにすることができます。

merge into your_table ut
using (
  select rowid, 
         row_number() over (partition by user_id order by note_id) as rn
  from your_table
) t on (ut.rowid = t.rowid)
when matched then update
  set order_column = rn;

これは予約語であるため、列を作成できないことに注意してくださいorder(実際には、二重引用符を使用して作成できますが、そうしないことを強くお勧めします)。

于 2012-06-11T10:23:38.940 に答える