valores update una tablas tabla otra masivo datos con actualizar sql oracle sql-update

update - Oracle SQL: actualice una tabla con datos de otra tabla



update de una tabla a otra postgresql (7)

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 SQL que puede actualizar la Tabla 1 con el name y el desc la Tabla 2 usando 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 toma de actualizar una tabla con datos de otra , pero específicamente para Oracle SQL.


Aquí parece haber una respuesta aún mejor con la cláusula ''in'' que permite varias 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 es tener las columnas que desea utilizar como la clave entre paréntesis en la cláusula where antes de ''in'' y tener la instrucción select con los mismos nombres de columna entre paréntesis. donde ( columna1, columna2 ) en ( seleccione ( columna1, columna2 ) de la tabla donde "el conjunto que quiero" );


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 )

Suponiendo que la combinación da como resultado una vista preservada de clave, 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


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;


Si su tabla t1 y su copia de seguridad t2 tienen muchas columnas, esta es una forma compacta de hacerlo.

Además, mi problema relacionado era que solo algunas de las columnas se modificaron y muchas filas no tenían modificaciones en estas columnas, por lo que quería dejarlas en paz: restaurar básicamente un subconjunto de columnas de una copia de seguridad de toda la tabla. Si desea simplemente restaurar todas las filas, omita la cláusula where.

Por supuesto, la forma más simple sería eliminar e insertar como seleccionar, pero en mi caso necesitaba una solución con solo actualizaciones.

El truco es que cuando selecciona * de un par de tablas con nombres de columna duplicados, el segundo recibirá el nombre _1. Así que esto es lo que se me ocurrió:

update ( select * from t1 join t2 on t2.id = t1.id where id in ( select id from ( select id, col1, col2, ... from t2 minus select id, col1, col2, ... from t1 ) ) ) set col1=col1_1, col2=col2_1, ...


tratar

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);


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


Update table set column = (select...)

nunca funcionó para mí, ya que el conjunto 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 lo ejecuta en la hoja de cálculo de SQLDeveloper. Dicen que es lento, pero esa es la única solución que funcionó para mí en este caso.