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

时间:2015-02-24 18:49:39

标签: sql oracle plsql

我有几个表使用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

开始这个的最佳方法是什么?每当我尝试时,我最终都会转动轮子。

1 个答案:

答案 0 :(得分:2)

尝试这样的事情:

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

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

(分析函数中的Partition关键字与GROUP by keyword非常相似)

[编辑] 要更新原始表,我实际上更喜欢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

[编辑]