Oracle

使用連續數字從 0 開始的索引列更新表中的行

  • October 19, 2015

我在 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(這就提出了為什麼你同時擁有這兩者的問題——因為一個可以很容易地從另一個導出)。

引用自:https://dba.stackexchange.com/questions/118441