可有一個人幫我...迭代非順序列
我要創建,爲每個「負荷消費」,對於非連續ID來更新「版本」列中的迭代器。
我需要一個遊標或其他東西?
我可以得到一些幫助嗎?
例子:
ID COSTUMER VERSION
12 ANNA 1
24 ANNA 4
25 ANNA 5
60 ANNA 11
我要糾正的版本是連續
可有一個人幫我...迭代非順序列
我要創建,爲每個「負荷消費」,對於非連續ID來更新「版本」列中的迭代器。
我需要一個遊標或其他東西?
我可以得到一些幫助嗎?
例子:
ID COSTUMER VERSION
12 ANNA 1
24 ANNA 4
25 ANNA 5
60 ANNA 11
我要糾正的版本是連續
你可以使用代碼是這樣的:
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'等。如果不是,您可以刪除該部分。
爲什麼在一個合併語句中可以循環遊標呢? – Boneist
因爲我沒有想到! –
這裏是通過一個單一的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;
它的工作,謝謝:) –
順便說一句,這個合併語句加入了rowid(我通常不會推薦的東西),但否則連接條件將在costumer和版本上,但Oracle不允許更新列在連接條款中,這會阻止我們升級版本列。 – Boneist
你能舉個例子嗎?至少我不清楚「非序列」身份證是什麼意思。 –
請更詳細和提供一個例子 –
ID COSTUMER VERSION 12 ANNA 1 24 ANNA 4 25 ANNA 5 60 ANNA 11 我什麼糾正版本被順序。 –