Actualizar una tabla con datos de otra tabla

Resuelto Muhd asked hace 13 años • 8 respuestas

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 ejecuto una consulta de actualización de SQL que pueda actualizar la Tabla 1 con la Tabla 2 namey descusar la misma id? Entonces el resultado final que obtendría es

Tabla 1:

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

La pregunta se tomó de actualizar una tabla con datos de otra , pero específicamente para Oracle SQL.

Muhd avatar Aug 12 '11 01:08 Muhd
Aceptado

Esto se llama 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 )

Suponiendo que la unión dé como resultado 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
Justin Cave avatar Aug 11 '2011 19:08 Justin Cave

Prueba esto:

MERGE INTO table1 t1
USING
(
-- For more complicated queries you can use WITH clause here
SELECT * FROM table2
)t2
ON(t1.id = t2.id)
WHEN MATCHED THEN UPDATE SET
t1.name = t2.name,
t1.desc = t2.desc;
Adrian avatar Sep 23 '2015 20:09 Adrian

intentar

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);
Yahia avatar Aug 11 '2011 18:08 Yahia
Update table set column = (select...)

nunca funcionó para mí ya que set solo espera 1 valor - Error de SQL: ORA-01427: la subconsulta de una sola fila devuelve más de una fila.

aquí está la solución:

BEGIN
For i in (select id, name, desc from table1) 
LOOP
Update table2 set name = i.name, desc = i.desc where id = i.id;
END LOOP;
END;

Así es exactamente como se ejecuta en la hoja de trabajo de SQLDeveloper. Dicen que es lento pero esa es la única solución que me funcionó en este caso.

Pau Karr avatar Jun 27 '2013 03:06 Pau Karr