복붙노트

[SQL] 오라클 : ORDER BY 절과 함께 ROWNUM을 사용하여 테이블 열을 업데이트

SQL

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

나는 그래서 ROWNUM을 사용하여 생각하고, 실행중인 정수와 테이블 열을 채우는합니다. 그러나, 나는 다른 컬럼, ORDER BY의 1 열, 2 열 같은의 순서에 따라 그것을 채울 필요가있다. 오라클은 다음과 같은 성명을 허용하지 않기 때문에 즉, 불행하게도, 수 없습니다 :

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

도 아니다 다음 문장 (절과 함께 사용하기 위해) :

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

그래서 어떻게 그것이 SQL 문을 사용하여 PL / SQL에서 반복 방법을 커서에 의지하지 않고합니까?

해결법

  1. ==============================

    1.이 작동합니다 (나를 위해 작품)

    이 작동합니다 (나를 위해 작품)

    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
    
  2. ==============================

    2.

     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)
    

    그러나 그것은 매우 빠르지 않을 것이며, 데미안가 지적했듯이, 당신은 다시 실행이 사항에 해당 테이블의 데이터를 변경할 때마다이있다.

  3. ==============================

    3.첫 번째 시퀀스를 만들기 :

    첫 번째 시퀀스를 만들기 :

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

    순서를 사용하여 해당 업데이트 테이블 후 :

    UPDATE table_name
    SET colun_name = SEQ_SLNO.NEXTVAL;
    
  4. ==============================

    4.작은 보정 마찬가지로 RN 추가 :

    작은 보정 마찬가지로 RN 추가 :

    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)
    
  5. from https://stackoverflow.com/questions/6094039/oracle-updating-a-table-column-using-rownum-in-conjunction-with-order-by-clause by cc-by-sa and MIT license