使用 SQL 或 PL/SQL 重新索引列

Re-indexing a column with either SQL or PL/SQL

我有几个表使用一个 ID 号加上一个名为 xsequence 的列,它们都是主键。目前,我有一堆数据如下所示:

ID_NUMBER,XSEQUENCE
001,2
001,5
001,8
002,1
002,6

我需要结束的是:

ID_NUMBER,XSEQUENCE
001,1
001,2
001,3
002,1
002,2

开始这项工作的最佳方式是什么?每次我尝试,我都只是在旋转我的轮子。

尝试这样的事情:

select id_number,
       row_number() over (partition by id_number order by xsequence) new_xsequence
  from yourtable

对于这类事情,这是一个非常方便的分析函数。使用 Partition 关键字 - "resets" 每个 id_number 处的计数器。 (所以 1,2,3 .. 然后再次开始 1,2,3 ... 等等)。

(解析函数中的Partition关键字与GROUP by关键字的行为非常相似)

[编辑] 要更新原始的 table,我实际上更喜欢 MERGE 语句 - 它的语法更简单,而且看起来更直观 ;))

  MERGE INTO yourtable  base
     USING (
              select rowid   rid,
                     id_number,
                     row_number() over (partition by id_number order by xsequence) new_xsequence,
                     xsequence   old_xsequence
                from yourtable
           ) new
     ON ( base.rowid = new.rid )
     WHEN MATCHED THEN UPDATE
        SET base.xsequence = new.new_xsequence

[编辑]