2011-07-26 20 views
7

Sé que no hay ninguna instrucción Update-Join en PL/SQL. Solía ​​escribir T-SQL.Actualización PL/SQL ¿Unirse?

Tengo dos tablas.

Alex_Table1 
--------------------------- 
PK   VAL 
--------------------------- 
1   Value1 
2   Value2 
3   Value3 


Alex_Table2 
--------------------------- 
PK   VAL 
--------------------------- 
1   Value1_2 
3   Value3_2 

Quiero actualizar VAL de Alex_Table2 a Alex_Table1 que se unen en la columna PK.

En T-SQL, que es sencilla

update t1 set t1.VAL = t2.VAL 
from 
    Alex_Table1 t1 
    inner join Alex_Table2 t2 on t1.PK = t2.PK; 

y el resultado es lo que esperaba

Alex_Table1 
--------------------------- 
PK   VAL 
--------------------------- 
1   Value1_2 
2   Value2 
3   Value3_2 

Mi pregunta es cómo hacerlo en PL/SQL? ¡Gracias!

actualización

Gracias Cybernate y ypercube me dio dos soluciones útiles. Ambos trabajan. Sin embargo, quiero que sepa el rendimiento entre estas dos declaraciones.

Mi tabla actual contiene 80,000 registros y solo 3,000 necesitan actualización.

MERGE extracto toma 0,533 segundos.

UPDATE EXISTS declaración se hace cargo de 3 minutos (yo no mido el tiempo real. Yo por terminada mi proceso después de 3 minutos.)

Respuesta

13

Use una instrucción MERGE:

MERGE INTO Alex_Table1 t1 
USING Alex_Table2 t2 
ON (t1.PK = t2.PK) 
WHEN MATCHED THEN 
UPDATE SET t1.VAL = t2.VAL 
+0

¡GUAU! <- esta es mi única expresión! ¡Gracias! ¡Esto es simple y directo! ¡Gracias! –

+0

Tengo otra pregunta. En mi caso actual, la declaración de actualización solo involucraba dos tablas. ¿Puedo usar la instrucción MERGE si la declaración de actualización involucró más de dos tablas? –

+0

Puede hacer cualquier consulta válida en lugar de Alex_Table2 en la consulta anterior. Consulte este enlace para obtener más información: http://psoug.org/reference/merge.html – Chandu

5
UPDATE Alex_Table1 t1 
SET t1.VAL = 
     (SELECT t2.VAL 
     FROM Alex_Table2 t2 
     WHERE t2.PK = t1.PK 
    ) 
WHERE EXISTS 
     (SELECT * 
      FROM Alex_Table2 t2 
      WHERE t2.PK = t1.PK 
     ) 

Esto también funciona (siempre y cuando (PK) es la clave primaria de Alex_Table2) :

UPDATE 
    (SELECT t1.VAL A, t2.VAL B 
    FROM Alex_Table1 t1 
     JOIN Alex_Table2 t2 
     ON t2.PK = t1.PK 
) 
SET A = B ; 

Probado a dbfiddle.uk.

+0

@Alex: un vistazo a la segunda manera también. Ya que está familiarizado con JOINs, debería ser bastante fácil extender una actualización a más de 2 tablas. –

+0

Lo siento, su segunda declaración no funciona. El mensaje de error es 'Error de SQL: ORA-00904:" T2 "." VAL ": identificador no válido' –

+0

@Alex: ¿Puedes intentarlo ahora? No tengo una máquina Oracle disponible ahora para probar. –