Oracle: Updating a table column using ROWNUM in conjunction with ORDER BY clause

后端 未结 4 488
野的像风
野的像风 2020-12-01 12:45

I want to populate a table column with a running integer number, so I\'m thinking of using ROWNUM. However, I need to populate it based on the order of other columns, someth

相关标签:
4条回答
  • 2020-12-01 13:13

    First Create a sequence :

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

    after that Update the table using the sequence:

    UPDATE table_name
    SET colun_name = SEQ_SLNO.NEXTVAL;
    
    0 讨论(0)
  • 2020-12-01 13:21

    This should work (works for me)

    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);
    

    OR you use the MERGE statement. Something like this.

    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
    
    0 讨论(0)
  • 2020-12-01 13:21

    A small correction just add AS 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)
    
    0 讨论(0)
  • 2020-12-01 13:31
     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)
    

    But that won't be very fast and as Damien pointed out, you have to re-run this statement each time you change data in that table.

    0 讨论(0)
提交回复
热议问题