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 la Tabla 2 name
y desc
usar 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 la actualización de una tabla con datos de otra , pero específicamente para Oracle SQL.
sql
oracle
sql-update
Muhd
fuente
fuente
Respuestas:
Esto se llama actualización correlacionada
Suponiendo que la unión da como resultado una vista con clave preservada, también podría
fuente
WHERE EXISTS
impide actualizar una filat1
si no hay una fila coincidentet2
. Sin ella, cada filat1
se actualizará y los valores se establecerán enNULL
si no hay una fila coincidentet2
. Eso generalmente no es lo que quiere que suceda, por loWHERE EXISTS
que generalmente se necesita.SELECT ... FROM t2
debe ser una fila única. Esto significa que debe seleccionar en todos los campos que comprenden una clave única; una clave primaria no única no es suficiente. Sin unicidad, se reduce a algo como el bucle de @ PaulKarr, y si no hay una correlación única, entonces se puede actualizar más de una fila de destino para cada fila de origen.table2
) está devolviendo varias filas para uno o mástable1
valores y Oracle no sabe cuál desea usar. Normalmente, eso significa que necesita refinar la subconsulta para que devuelva una única fila distinta.Prueba esto:
fuente
table1
ytable2
son la misma tabla, solo tenga en cuenta la parteON
y laWHERE
cláusula para laSELECT
declaración detable2
!tratar
fuente
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:
Así es exactamente como lo ejecuta en la hoja de trabajo SQLDeveloper. Dicen que es lento, pero esa es la única solución que me funcionó en este caso.
fuente
Aquí parece haber una respuesta aún mejor con la cláusula 'in' que permite múltiples claves para la unión :
El problema está en tener las columnas que desea utilizar como 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. where ( column1, column2 ) en ( select ( column1, column2 ) de la tabla donde "el conjunto que quiero" );
fuente
404
)Si su tabla t1 y su copia de seguridad t2 tienen muchas columnas, aquí hay 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, básicamente restaurar un subconjunto de columnas a partir de una copia de seguridad de toda la tabla. Si solo desea restaurar todas las filas, omita la cláusula where.
Por supuesto, la forma más sencilla sería eliminar e insertar como select, 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, la segunda se llamará _1. Así que esto es lo que se me ocurrió:
fuente
fuente