Oracle
使用連續數字從 0 開始的索引列更新表中的行
我在 Oracle 數據庫中有一些帶有一些“規則”的表:INDEX_COLUMN 必須從 0 開始並且必須是連續數字,並且 NRCRT 列必須從 1 開始並且也是連續數字。我製作了一個腳本來辨識不遵循此規則的行,但我不知道如何修改這些行(id)。辨識行的腳本是:
select ID,NRCRT,H_ID,INDEX_COLUMN from ANEXE_H_ROWS where H_ID in ( select anexa.id from ( select ANEXA_ROWS.H_ID as id, ANEXA_ROWS.INDEX_COLUMN as idx from chest CH inner join investig INV on INV.FK_ID_CHEST = CH.ID inner join tip_investig TIP_INV on TIP_INV.ID = INV.FK_TIP_INVESTIG inner join ANEXE_H ANEXA on ANEXA.FK_ID_INVESTIG = INV.ID inner join ANEXE_H_ROWS ANEXA_ROWS on ANEXA_ROWS.H_ID = ANEXA.ID ) anexa group by anexa.id having max(anexa.idx)+1<>count(*) or min(anexa.idx)<>0 ) order by H_ID,INDEX_COLUMN
假設它返回:
ID NRCRT H_ID INDEX_COLUMN 2517 8 1136 7 2518 9 1136 8 2519 10 1136 9 2520 11 1136 10 2521 12 1136 11 2522 13 1136 12 2523 14 1136 13 3000 2 1137 1 3001 3 1137 2 3002 4 1137 3
如何修改腳本以更改要返回的表:
ID NRCRT H_ID INDEX_COLUMN 2517 1 1136 0 2518 2 1136 1 2519 3 1136 2 2520 4 1136 3 2521 5 1136 4 2522 6 1136 5 2523 7 1136 6 3000 1 1137 0 3001 2 1137 1 3002 3 1137 2
要更新表中的值,您可以使用 MERGE 語句(
alter
用於更改表的結構,而不是更改值。這是通過 UPDATE 或 MERGE 完成的)merge into anexe_h_rows using ( select id, row_number() over (partition by h_id order by nrcrt) as rn from anexe_h_rows ) t ON (t.id = anexe_h_rows.id) when matched then update set nrcrt = rn, index_column = rn - 1;
這假定這
anexe_h_rows.id
是該表的主鍵。它還假設列
nrcrt
的值總是比列的值大一index_column
(這就提出了為什麼你同時擁有這兩者的問題——因為一個可以很容易地從另一個導出)。