bestsource

Oracle: ORDER BY 절과 함께 ROWNUM을 사용하여 테이블 열 업데이트

bestsource 2023. 6. 23. 22:19
반응형

Oracle: ORDER BY 절과 함께 ROWNUM을 사용하여 테이블 열 업데이트

테이블 열을 실행 정수로 채우고 싶어서 ROWNUM을 사용하려고 합니다.하지만 다른 열의 순서에 따라 채워야 합니다.ORDER BY column1, column2안타깝게도 Oracle은 다음 문구를 수락하지 않기 때문에 이는 불가능합니다.

UPDATE table_a SET sequence_column = rownum ORDER BY column1, column2;

다음 문도 없습니다(WITH 절 사용 시도).

WITH tmp AS (SELECT * FROM table_a ORDER BY column1, column2)
UPDATE tmp SET sequence_column = rownum;

그렇다면 PL/SQL에서 커서 반복 방법을 사용하지 않고 SQL 문을 사용하여 어떻게 해야 합니까?

이 방법이 효과가 있을 것입니다(제게 효과가 있습니다).

update table_a outer 
set sequence_column = (
    select rnum from (

           -- evaluate row_number() for all rows ordered by your columns
           -- BEFORE updating those values into table_a
           select id, row_number() over (order by column1, column2) rnum  
           from table_a) inner 

    -- join on the primary key to be sure you'll only get one value
    -- for rnum
    where inner.id = outer.id);

또는 다음을 사용합니다.MERGE진술.이런 거.

merge into table_a u
using (
  select id, row_number() over (order by column1, column2) rnum 
  from table_a
) s
on (u.id = s.id)
when matched then update set u.sequence_column = s.rnum
 UPDATE table_a
     SET sequence_column = (select rn 
                             from (
                                select rowid, 
                                      row_number() over (order by col1, col2)
                                from table_a
                            ) x
                            where x.rowid = table_a.rowid)

그러나 Damien이 지적했듯이 테이블의 데이터를 변경할 때마다 이 문을 다시 실행해야 합니다.

첫 번째 시퀀스 만들기:

CREATE SEQUENCE SEQ_SLNO
  START WITH 1
  MAXVALUE 999999999999999999999999999
  MINVALUE 1
  NOCYCLE
  NOCACHE
  NOORDER;

그런 다음 순서를 사용하여 표를 업데이트합니다.

UPDATE table_name
SET colun_name = SEQ_SLNO.NEXTVAL;

조금만 수정하면 ASN을 추가할 수 있습니다.

UPDATE table_a
     SET sequence_column = (select rn 
                             from (
                                select rowid, 
                                      row_number() over (order by col1, col2) AS RN
                                from table_a
                            ) x
                            where x.rowid = table_a.rowid)

언급URL : https://stackoverflow.com/questions/6094039/oracle-updating-a-table-column-using-rownum-in-conjunction-with-order-by-clause

반응형