viernes, 21 de enero de 2011

ORACLE y UPDATE con varias tablas

hay situaciones en las que tienes que actualizar el valor del campo de una tabla, con el valor de una consulta (mediante una relación 1 a 1).

La primera manera es:
UPDATE tablaA set
campoA1 = (
select distinct campoB1
from tablaB
where tablaB.campoBi = tablaA.campoAi
)
...

una forma eficiente más eficiente es la siguiente:

UPDATE (
SELECT
tablaA.campoA1,
tablaB.campoB1
FROM tablaA
INNER JOIN tablaB on tablaB.campoBi = tablaA.campoAi)
)
SET campoA1 = campoB1;

Para que esta segunda opción funcione necesitamos tener UNIQUE or PRIMARY KEY constraint en la relación entre tablas.

Si no tienes esta constraint, puedes utilizar el hint /*+BYPASS_UJVC*/ después de la palabra UPDATE
(bypass update join view constraint).

Vistas de ORACLE

//listado del diccionario de datos
select * from dictionary

//tablas de un esquema
select * from user_tables

//todos los objetos de un esquema
select * from user_catalog

//productos ORACLE instalados
select * from product_component_version

//listado de constraint con columnas
select * from sys.all_cons_columns

//listado de todos los sinonimos
SELECT * from sys.all_synonyms

//listado de usuarios
Select * FROM dba_users

//listado de los argumentos de las funciones/procedimientos de PL/SQL
SELECT * FROM all_arguments