2015-02-24 47 views
0

我有几个表使用ID号加上名为xsequence的列都是主键。目前,我有一堆数据,看起来像这样:使用SQL或PL/SQL重新索引列

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 

什么是去有关启动的最佳方式?每次尝试时,我最终都会旋转我的轮子。

+4

你的意思是使用两列复合主键?推测你也需要更新相关的外键值。但是,你是否真的需要这样做 - 实际价值是否重要?或者换个角度来看,你是否需要实际更新值,或者查询/视图使序列看起来连续足够吗? – 2015-02-24 18:54:00

+0

我们认为他们需要成为顺序订单,因为他们正在搞乱我们试图做的更新。 – 2015-02-24 18:56:50

+1

听起来像你可能试图解决错误的问题。特别是如果未来的变化(删除)会再次引入缺口。也许你可以解释你的原始问题,为什么你认为让它们相连会有所帮助;尽管这当然可能是一个非常不同的问题。 – 2015-02-24 18:58:31

回答

2

尝试这样:

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

这是一个解析函数确实方便了这样的事情。使用分区关键字 - 在每个id_number处“重置”计数器。 (所以1,2,3 ..然后再次开始1,2,3 ...等)。

(在分析功能分区关键字的行为非常类似于关键字GROUP)

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

[编辑]

+0

这是完美的!现在我怎么能把它纳入更新声明? – 2015-02-24 19:08:00

+1

'UPDATE(select id_number, row_number()over(由id序号按xsequence分区)new_xsequence from yourtable)SET xsequence = new_xsequence;' – 2015-02-24 19:22:35

+0

这不起作用。我得到这个错误:[错误]执行(14:35):ORA-38104:ON子句中引用的列无法更新:“BASE”。“XSEQUENCE” – 2015-02-24 20:02:00