UPDATE con JOIN en ORACLE

Supongamos que queremos actualizar en nuestra bbdd ORACLE el campo de costes de la tabla de hechos FAC_TABLE con el coste unitario de nuestra tabla de COSTES.

Podemos hacerlo de dos maneras:

1. (Lenta, pero si es para pocos datos o para lanzarlo esporádicamente nos puede valer)

update FAC_TABLE ft
set COSTE_UNITARIO = (select distinct COSTE_UNITARIO  from COSTES ct 
 where (ft.id_articulo = ct.id_articulo);

2. (la mejor manera es esta, y el rendimimento es óptimo si tiene constraints)

UPDATE (
 SELECT 
   ft.COSTE_UNITARIO AS old_coste,
   ct.COSTE_UNITARIO AS new_coste
 FROM FAC_TABLE ft
 INNER JOIN COSTES ct ON ft.id_articulo = ct.id_articulo)
)
SET old_coste = new_coste;

Para que esta segunda oción funcione necesitamos tener UNIQUE or PRIMARY KEY constraint en ct.id_articulo.
Si no tienes esta constraint, puedes utilizar el hint /*+BYPASS_UJVC*/ después de la palabra UPDATE
(bypass update join view constraint). El rendimiento aumenta si tenemos la constraint pero aún sin ella debe correr mucho más que la primera opción.

Espero que os ayude.

Héctor Minguet.

Responder

El contenido de este campo se mantiene como privado y no se muestra públicamente.
  • Saltos automáticos de líneas y de párrafos.
  • Links to specified hosts will have a rel="nofollow" added to them.

  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.

Más información sobre opciones de formato

CAPTCHA
Esta comprobación es para evitar el spam
Image CAPTCHA
Copy the characters (respecting upper/lower case) from the image.

Busqueda con el motor de Google

Google