SQL - update de los campos de una tabla con los valores de otra tabla

 
Vista:
sin imagen de perfil

update de los campos de una tabla con los valores de otra tabla

Publicado por Kike Astu (7 intervenciones) el 07/10/2015 18:05:03
Hola amigos. Tengo una urgencia que no sé cómo resolver:
Es sobre una sentencia de actualización de determinados campos de una tabla, basada en los datos de otra tabla:
- Tengo una tabla "T2" que tiene los mismos campos que otra tabla "T1".
- Quiero actualizar los valores de determinados campos de todos los registros de la tabla T1 con los valores de esos mismos campos de la tabla T2

Con la consulta que hago para verificar que estoy leyendo lo mismo no tengo problemas. hago lo siguiente:

SELECT T1.campo1, T2.campo1, T1.campo2, T2.campo2
FROM tabla1 T1, tabla2 T2
WHERE T1.campoN=T2.campoN AND T1.campoX=T2.campoX

Ahora, me gustaría hacer el UPDATE de la siguiente manera:

UPDATE tabla1 T1 SET T1.campo1=T2.campo1, T1.campo2=T2.campo2

Es decir, quiero que los campos Campo1 y Campo2 de todos los registros de la tabla T1 tengan los mismos valores que los mismos campos en la tabla T2 para todos los registros que cumplan la condición del WHERE, es decir, cómo se relacionan las dos tablas.
Lo que no sé es como acabar la sentencia.
Cómo hago el WHERE de la sentencia UPDATE??

No sé si me he explicado bien, pero gracias de antemano..

Muchas gracias..!!!
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

update de los campos de una tabla con los valores de otra tabla

Publicado por leonardo_josue (1173 intervenciones) el 07/10/2015 19:03:44
Hola Kike Astu:

La sintaxis para la sentencia UPDATE varía entre los distintos manejadores de BD's, este es un foro de SQL, lo que quiere decir que está enfocado en el lenguaje de consultas, no en los DBMS's. Es importante que primero nos digas con qué BD's estás trabajando, para poderte darte una respuesta puntual.

una manera CASI estándar para hacer lo que quieres sería así, (El ejemplo es en MySQL, pero puede funcionar para varios DBMS)

Supongamos que tienes estas dos tablas:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
mysql> SELECT * FROM tabla1;
+------+-------------+
| id_1 | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | dos         |
|    3 | tres        |
+------+-------------+
3 rows in set (0.00 sec)
 
mysql> SELECT * FROM tabla2;
+------+-------------+
| id_1 | descripcion |
+------+-------------+
|    1 | one         |
|    2 | two         |
|    4 | four        |
+------+-------------+
3 rows in set (0.00 sec)

ahora bien, haciendo una consulta como la que tienes, podemos ver que hay dos registros que aparecen en ambas tablas:

1
2
3
4
5
6
7
8
9
10
mysql> SELECT T1.id_1, T1.descripcion, T2.id_1, T2.descripcion
    -> FROM tabla1 T1, tabla2 T2
    -> WHERE T1.id_1 = t2.id_1;
+------+-------------+------+-------------+
| id_1 | descripcion | id_1 | descripcion |
+------+-------------+------+-------------+
|    1 | uno         |    1 | one         |
|    2 | dos         |    2 | two         |
+------+-------------+------+-------------+
2 rows in set (0.00 sec)

Ahora, si quisiéramos copiar el contenido de la tabla1 a la tabla2 con un UPDATE, lo que hacemos es lo siguiente:

1
2
3
4
mysql> UPDATE tabla1 T1, tabla2 T2 SET T2.descripcion = T1.descripcion
    -> WHERE T1.id_1 = t2.id_1;
Query OK, 2 rows affected (0.13 sec)
Rows matched: 2  Changed: 2  Warnings: 0

De esta manera, si consultamos nuevamente la tabla 2, encontraremos que se modificaron dos de los registros:

1
2
3
4
5
6
7
8
9
mysql> SELECT * FROM tabla2;
+------+-------------+
| id_1 | descripcion |
+------+-------------+
|    1 | uno         |
|    2 | dos         |
|    4 | four        |
+------+-------------+
3 rows in set (0.00 sec)

haz la prueba y nos comentas.

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

update de los campos de una tabla con los valores de otra tabla

Publicado por Kike Astu (7 intervenciones) el 07/10/2015 19:22:22
Muchas gracias por tu respuesta. Probaré.
La bbdd con la que trabajo es de Oracle. Utilizo SQL Developer.

Un saludo..!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil

update de los campos de una tabla con los valores de otra tabla

Publicado por Kike Astu (7 intervenciones) el 08/10/2015 08:32:03
Hola Leonardo.
Probé como me dijiste, pero me da un error. Esta es la sentencia:

UPDATE PRODDTA.F0901 T1, PRODDTA.F0901BIBAL T2
SET T1.gmr001=T2.gmr001,T1.gmr002=T2.gmr002
WHERE T1.GMOBJ=T2.GMOBJ AND T1.GMSUB=T2.GMSUB

Y el error, que según el log está justo después de la coma del UPDATE, al tratar de nombra la seguna tabla:

Error que empieza en la línea 9 del comando:
UPDATE PRODDTA.F0901 T1, PRODDTA.F0901BIBAL T2
SET T1.gmr001=T2.gmr001,T1.gmr002=T2.gmr002
WHERE T1.GMOBJ=T2.GMOBJ AND T1.GMSUB=T2.GMSUB
Error en la línea de comandos:9 Columna:24
Informe de error:
Error SQL: ORA-00971: falta la palabra clave SET
00971. 00000 - "missing SET keyword"
*Cause:
*Action:

Será porque es Oracle SQL Developer y utiliza otro tipo de nomenclatura?
Muchas gracias..!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 806
Bronce
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

update de los campos de una tabla con los valores de otra tabla

Publicado por leonardo_josue (1173 intervenciones) el 08/10/2015 19:16:49
Hola de nuevo Kike Astu:

Oracle no permite la actualización basada en varias tablas, (Es por eso que te decía la importancia de mencionar con qué BD's estás trabajando). Para hacer lo que quieres en ORACLE, puedes hacerlo de dos formas, una sería con subconsultas, es decir, hacer algo como esto:

1
2
3
4
5
6
7
8
UPDATE tabla2 SET
tabla2.descripcion = ( SELECT descripcion
                       FROM tabla1
		       WHERE tabla1.id = tabla2.id )
WHERE
EXISTS ( SELECT id
         FROM tabla1
         WHERE tabla1.id = tabla2.id)

La otra forma sería utilizando MERGE... pero no estoy completamente seguro de la sintaxis, checa esta liga, te puede servir:

http://stackoverflow.com/questions/2446764/oracle-update-statement-with-inner-join

Saludos
Leo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

update de los campos de una tabla con los valores de otra tabla

Publicado por Kike Astu (7 intervenciones) el 09/10/2015 12:47:45
Muchas gracias, Leonardo.

Al final, siguiendo el link que me has enviado, he logrado hacerlo con un MERGE.

Perfecto..!!! Así que repito, muchísimas gracias por tu ayuda.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

update de los campos de una tabla con los valores de otra tabla

Publicado por Alejandra Galván (1 intervención) el 01/06/2022 17:35:09
Muchas gracias por tu respuesta Leonardo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de xve
Val: 135
Ha mantenido su posición en SQL (en relación al último mes)
Gráfica de SQL

update de los campos de una tabla con los valores de otra tabla

Publicado por xve (284 intervenciones) el 07/10/2015 21:03:34
Excelente Leonardo!!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar