Tengo dos mesas:
A [ID, column1, column2, column3]
B [ID, column1, column2, column3, column4]
A
siempre estará subconjunto de B
(lo que significa que todas las columnas de A
también están en B
).
Quiero actualizar un registro con una específica ID
en B
con sus datos de A
para todas las columnas de A
. Esta ID
existe tanto en A
y B
.
¿Existe una UPDATE
sintaxis o alguna otra forma de hacerlo sin especificar los nombres de las columnas, simplemente diciendo "establecer todas las columnas de A" ?
Estoy usando PostgreSQL, por lo que también se acepta un comando no estándar específico (sin embargo, no es preferido).
Respuestas:
Puede usar la cláusula FROM no estándar .
fuente
La pregunta es antigua pero sentí que la mejor respuesta aún no se había dado.
Solución general con SQL dinámico
No necesita saber ningún nombre de columna, excepto algunas columnas únicas para unirse (
id
en el ejemplo). Funciona de manera confiable para cualquier posible caso de esquina que se me ocurra.Esto es específico de PostgreSQL. Estoy construyendo código dinámico basado en el esquema de información , en particular la tabla
information_schema.columns
, que se define en el estándar SQL y la mayoría de los RDBMS principales (excepto Oracle) lo tienen. Pero unaDO
declaración con código PL / pgSQL que ejecuta SQL dinámico es una sintaxis PostgreSQL totalmente no estándar.Asumiendo una columna coincidente
b
para cada columnaa
, pero no al revés.b
puede tener columnas adicionales.WHERE b.id = 123
es opcional, para actualizar una fila seleccionada.SQL Fiddle.
Respuestas relacionadas con más explicaciones:
Soluciones parciales con SQL simple
Con lista de columnas compartidas
Aún necesita conocer la lista de nombres de columna que comparten ambas tablas. Con un acceso directo de sintaxis para actualizar varias columnas, más corto que lo que otras respuestas sugirieron hasta ahora en cualquier caso.
SQL Fiddle.
Esta sintaxis se introdujo con Postgres 8.2 en 2006, mucho antes de que se hiciera la pregunta. Detalles en el manual.
Relacionado:
Con lista de columnas en
B
Si todas las columnas de
A
están definidosNOT NULL
(pero no necesariamenteB
),y se conocen los nombres de las columnas de
B
(pero no necesariamenteA
).Se
NATURAL LEFT JOIN
une a una fila desdeb
donde todas las columnas del mismo nombre contienen los mismos valores. No necesitamos una actualización en este caso (nada cambia) y podemos eliminar esas filas al principio del proceso (WHERE b.id IS NULL
).Todavía necesitamos encontrar una fila coincidente, así que
b.id = ab.id
en la consulta externa.db <> violín aquí
Viejo sqlfiddle.
Este es SQL estándar, excepto por la
FROM
cláusula .Funciona sin importar en qué columnas estén realmente presentes
A
, pero la consulta no puede distinguir entre valores NULL reales y columnas faltantesA
, por lo que solo es confiable si todas las columnasA
están definidasNOT NULL
.Existen múltiples variaciones posibles, según lo que sepa sobre ambas tablas.
fuente
SET (column1) = (a.column)
) Postgres lo tratará como otro tipo de actualización y dará un error como este:source for a multiple-column UPDATE item must be a sub-SELECT or ROW() expression
He estado trabajando con la base de datos IBM DB2 durante más de una década y ahora estoy tratando de aprender PostgreSQL.
Funciona en PostgreSQL 9.3.4, pero no funciona en DB2 10.5:
Nota: El problema principal es DE, porque no es compatible con DB2 y tampoco con ANSI SQL.
Funciona en DB2 10.5, pero NO funciona en PostgreSQL 9.3.4:
¡FINALMENTE! Funciona tanto en PostgreSQL 9.3.4 como en DB2 10.5:
fuente
B
, la primera instrucción no hace nada (la fila original permanece intacta), mientras que las otras dos columnas de sobrescritura con valores NULL.Esta es una gran ayuda. El código
funciona perfectamente.
observó que necesita un soporte "" en
para que funcione
fuente
No necesariamente lo que pediste, pero ¿quizás podría ser útil usar la herencia de Postgres?
Esto evita la necesidad de actualizar B.
Pero asegúrese de leer todos los detalles .
De lo contrario, lo que solicita no se considera una buena práctica:
SELECT * ...
se desaconsejan las cosas dinámicas como las vistas con (ya que una leve conveniencia podría romper más cosas que ayudar a las cosas), y lo que pide sería equivalente alUPDATE ... SET
comando.fuente
puedes construir y ejecutar sql dinámico para hacer esto, pero realmente no es lo ideal
fuente
Intenta seguir
EDITADO: - Actualice más de una columna
fuente
UPDATE
en MySQL , pero no es válida para PostgreSQL.