2016-11-21 99 views
0

可有一個人幫我...迭代非順序列

我要創建,爲每個「負荷消費」,對於非連續ID來更新「版本」列中的迭代器。

我需要一個遊標或其他東西?

我可以得到一些幫助嗎?

例子:

ID COSTUMER   VERSION 
12 ANNA     1 
24 ANNA     4 
25 ANNA     5 
60 ANNA    11 

我要糾正的版本是連續

+0

你能舉個例子嗎?至少我不清楚「非序列」身份證是什麼意思。 –

+0

請更詳細和提供一個例子 –

+0

ID COSTUMER VERSION 12 ANNA 1 24 ANNA 4 25 ANNA 5 60 ANNA 11 我什麼糾正版本被順序。 –

回答

0

你可以使用代碼是這樣的:

begin 
    for r in (select id, row_number() over (partition by name order by version) as rn 
       from costumer 
      ) 
    loop 
     update costumer 
     set version = r.rn 
     where id = r.id; 
    end loop; 
end; 
/

partition by是存在的,因爲我假定你想讓序列從1開始爲'ANNA',然後從1開始再次爲客戶'JANE'等。如果不是,您可以刪除該部分。

+0

爲什麼在一個合併語句中可以循環遊標呢? – Boneist

+0

因爲我沒有想到! –

0

這裏是通過一個單一的MERGE語句來做到這一點:

MERGE INTO costumer tgt 
    USING (SELECT ID, 
       costumer, 
       VERSION, 
       ROWID row_id, 
       row_number() OVER (PARTITION BY costumer ORDER BY VERSION) new_version 
     FROM costumer) src 
    ON (tgt.rowid = src.rowid) 
WHEN MATCHED THEN 
UPDATE SET tgt.version = src.new_version; 
+0

它的工作,謝謝:) –

+0

順便說一句,這個合併語句加入了rowid(我通常不會推薦的東西),但否則連接條件將在costumer和版本上,但Oracle不允許更新列在連接條款中,這會阻止我們升級版本列。 – Boneist