sql >> Base de Datos >  >> RDS >> PostgreSQL

Actualice una columna de una tabla con una columna de otra tabla en PostgreSQL

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 en FROM Cláusula de un SELECT declaración. Tenga en cuenta que la tabla de destino no debe aparecer en la from_list , a menos que pretenda unirse a sí mismo (en cuyo caso debe aparecer con un alias en from_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?