2015-02-24 49 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