top first example 11g sql oracle sql-update rownum

sql - first - Oracle: actualizando una columna de tabla utilizando ROWNUM junto con la cláusula ORDER BY



select rownum oracle example (4)

Esto debería funcionar (funciona para mí)

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

O utiliza la instrucción MERGE . Algo como esto.

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

Quiero rellenar una columna de la tabla con un número entero en ejecución, por lo que estoy pensando en usar ROWNUM. Sin embargo, necesito rellenarlo según el orden de otras columnas, algo como ORDER BY column1, column2 . Desafortunadamente, esto no es posible ya que Oracle no acepta la siguiente declaración:

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

Tampoco la siguiente declaración (un intento de usar la cláusula WITH):

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

Entonces, ¿cómo lo hago usando una declaración SQL y sin recurrir al método de iteración del cursor en PL / SQL?


Primero crea una secuencia:

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

después de eso actualiza la tabla usando la secuencia:

UPDATE table_name SET colun_name = SEQ_SLNO.NEXTVAL;


Una pequeña corrección solo agrega 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)


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)

Pero eso no será muy rápido y, como señaló Damien, debe volver a ejecutar esta declaración cada vez que cambie los datos en esa tabla.