Tu UPDATE
la consulta debería verse así:
UPDATE table2 t2
SET val2 = t1.val1
FROM table1 t1
WHERE t2.table2_id = t1.table2_id
AND t2.val2 IS DISTINCT FROM t1.val1; -- optional, see below
Tal como lo tenía, no había ningún vínculo entre las filas individuales de las dos tablas. Cada fila se obtendría de table1
para cada fila en table2
. Esto no tenía sentido (de una manera costosa) y también provocó el error de sintaxis, porque una expresión de subconsulta en este lugar solo puede devolver un valor único.
Lo solucioné uniendo las dos tablas en table2_id
. Reemplázalo con lo que realmente vincule a los dos.
Reescribí el UPDATE
para unirse a table1
(con el FROM
cláusula) en lugar de ejecutar subconsultas correlacionadas, porque eso suele ser más rápido en un orden de magnitud.
También evita que table2.val2
se anularía si no se encuentra una fila coincidente en table1
. En cambio, nada sucede con tales filas con esta forma de consulta.
Puede agregar expresiones de tabla al FROM
lista como lo haría en un simple SELECT
(tablas, subconsultas, funciones de devolución de conjuntos, ...). El manual:
from_list
Una lista de expresiones de tabla, que permite que las columnas de otras tablas aparezcan en
WHERE
condición y las expresiones de actualización. Esto es similar a la lista de tablas que se pueden especificar enFROM
Cláusula de unSELECT
declaración. Tenga en cuenta que la tabla de destino no debe aparecer en lafrom_list
, a menos que pretenda unirse a sí mismo (en cuyo caso debe aparecer con un alias enfrom_list
).
El WHERE
final La cláusula evita actualizaciones que no cambiarían nada, lo que prácticamente siempre es una buena idea (costo casi completo pero sin ganancia, se aplican excepciones exóticas). Si se garantiza que tanto el valor antiguo como el nuevo son NOT NULL
, simplificar a:
AND t2.val2 <> t1.val1
- ¿Cómo puedo (o puedo) SELECCIONAR DISTINTO en varias columnas?