UPDATE con MERGE
Publicado: Mié Jun 16, 2010 10:31 am
Imaginemos estas dos tablas: ARTICULOS y NOVEDADES, donde NOVEDADES contiene los precios actualizados de algunos artículos, es decir, la tabla NOVEDADES contiene la relación de artículos cuyo precio ha cambiado y el nuevo precio.
La cuestión es que se debe actualizar la tabla ARTICULOS con los precios que indica la tabla NOVEDADES para aquellos artículos que contiene la tabla NOVEDADES.
La forma de realizar esta actualización con SQL sería la siguiente:
Si decidimos hacer esta actualización con PL/SQL, esta sería una posible solución:
El bloque de código anterior abre un cursor sobre la tabla NOVEDADES, e itera sobre todos los artículos que contiene, actualizando para cada uno de ellos el precio en la tabla ARTICULOS.
Sin embargo existe un método en oracle para realizar esta actualización de forma mucho más eficiente que los dos métodos anteriores usando la instrucción merge, la sentencia SQL quedaría de la siguiente manera:
Este método es especialmente adecuado cuando se deben tratar cientos de miles de registros o más.
Espero os sea útil.
La cuestión es que se debe actualizar la tabla ARTICULOS con los precios que indica la tabla NOVEDADES para aquellos artículos que contiene la tabla NOVEDADES.
La forma de realizar esta actualización con SQL sería la siguiente:
- Código: Seleccionar todo
update ARTICULO A
set A.PRECIO = (select N.PRECIO
from NOVEDADES N
where N.ID_ARTICULO = A.ID_ARTICULO)
where A.ID_ARTICULO in (select NOV.ID_ARTICULO
from NOVEDADES NOV)
Si decidimos hacer esta actualización con PL/SQL, esta sería una posible solución:
- Código: Seleccionar todo
declare
cursor novedades is
select ID_ARTICULO, PRECIO
from NOVEDADES;
begin
for cur_nov in novedades loop
update ARTICULOS
set PRECIO = cur_nov.precio
where ID_ARTICULO = cur_nov.id_articulo;
end loop;
end;
El bloque de código anterior abre un cursor sobre la tabla NOVEDADES, e itera sobre todos los artículos que contiene, actualizando para cada uno de ellos el precio en la tabla ARTICULOS.
Sin embargo existe un método en oracle para realizar esta actualización de forma mucho más eficiente que los dos métodos anteriores usando la instrucción merge, la sentencia SQL quedaría de la siguiente manera:
- Código: Seleccionar todo
merge into ARTICULOS ART
using
(
select ID_ARTICULO, PRECIO
from NOVEDADES
) NOV
on
(
ART.ID_ARTICULO = NOV.ID_ARTICULO
)
when matched then update set ART.PRECIO = NOV.PRECIO;
Este método es especialmente adecuado cuando se deben tratar cientos de miles de registros o más.
Espero os sea útil.