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_listUna lista de expresiones de tabla, que permite que las columnas de otras tablas aparezcan en
WHEREcondición y las expresiones de actualización. Esto es similar a la lista de tablas que se pueden especificar enFROMCláusula de unSELECTdeclaració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?