update - Consulta de actualización de Oracle para actualizar los registros en orden secuencial
update sql ejemplo dos tablas (2)
Podría usar una merge
, pero necesitaría unirse a algo que no sea emp_id
ya que desea actualizar esa columna. Si no hay otras columnas únicas, puede usar el rowid
:
merge into employee target
using (select rowid, row_number() over (order by emp_id) as emp_id from employee) source
on (source.rowid = target.rowid)
when matched then update set target.emp_id = source.emp_id;
Tengo una tabla en Oracle SQL cuyos identificadores están en aumento, orden secuencial, pero hay lagunas en los identificadores debido a la edición, por ejemplo, los identificadores son actualmente algo así como
22
23
24
32
33
44
...etc
Compruebo una publicación y la solución provista fue la siguiente:
update (select t.*, row_number() over (order by id) as newid) toupdate
set id = newid
Solución provista anteriormente.
Ahora mi consulta: 1) Supongo que falta la "cláusula From" en la consulta anterior.
Consulta actualizada:
update (select t.*,
row_number() over (order by emp_id) as newid
from employee t ) toupdate
set emp_id = newid;
2) Cuando ejecuto la consulta anterior, me da el error "operación de manipulación de datos no legal en esta vista".
¿Alguien puede explicar cómo funcionaban las soluciones mencionadas aquí? ¿Alguien puede publicar la consulta de actualización completa? Gracias.
Esta solución a la misma pregunta a la que hace referencia muestra cómo hacerlo:
update employee set emp_id = (
with tab as (
select emp_id, rownum r
from (select emp_id from employee order by emp_id)
)
select r from tab where employee.emp_id = tab.emp_id
);
Eso funciona. No puede actualizar una vista que contenga una función analítica como row_number. Consulte Oracle 12C docs , busque "Notas sobre las vistas actualizadas".