Oracle SQL: Actualizar una tabla con datos de otra tabla

Tabla 1:

id    name    desc
-----------------------
1     a       abc
2     b       def
3     c       adf

Tabla 2:

id    name    desc
-----------------------
1     x       123
2     y       345

En oracle SQL, ¿cómo puedo ejecutar una consulta sql update que pueda actualizar la Tabla 1 con el nombre y desc de la Tabla 2 utilizando el mismo id? Así que el resultado final que obtendría es

Tabla 1:

id    name    desc
-----------------------
1     x       123
2     y       345
3     c       adf

La pregunta está tomada de https://stackoverflow.com/questions/5036918/sql-update-query-with-data-from-another-table, pero específicamente para oracle SQL.

Solución

Esto se llama una actualización correlacionada

UPDATE table1 t1
   SET (name, desc) = (SELECT t2.name, t2.desc
                         FROM table2 t2
                        WHERE t1.id = t2.id)
 WHERE EXISTS (
    SELECT 1
      FROM table2 t2
     WHERE t1.id = t2.id )

Asumiendo que la unión resulta en una vista con clave preservada, también podría

UPDATE (SELECT t1.id, 
               t1.name name1,
               t1.desc desc1,
               t2.name name2,
               t2.desc desc2
          FROM table1 t1,
               table2 t2
         WHERE t1.id = t2.id)
   SET name1 = name2,
       desc1 = desc2
Comentarios (9)

pruebe con

UPDATE Table1 T1 SET
T1.name = (SELECT T2.name FROM Table2 T2 WHERE T2.id = T1.id),
T1.desc = (SELECT T2.desc FROM Table2 T2 WHERE T2.id = T1.id)
WHERE T1.id IN (SELECT T2.id FROM Table2 T2 WHERE T2.id = T1.id);
Comentarios (1)

Aquí parece haber una respuesta aún mejor con la cláusula 'in' que permite múltiples claves para la unión:

update fp_active set STATE='E', 
   LAST_DATE_MAJ = sysdate where (client,code) in (select (client,code) from fp_detail
  where valid = 1) ...

El ejemplo completo está aquí: http://forums.devshed.com/oracle-development-96/how-to-update-from-two-tables-195893.html

El problema está en tener las columnas que quieres usar como clave entre paréntesis en la cláusula where antes de 'in' y tener la sentencia select con los mismos nombres de columnas entre paréntesis. where (columna1,columna2) in ( select (columna1,columna2) from table where "el conjunto que quiero" );

Comentarios (0)