Actualizar o Insertar (varias filas y columnas) desde subconsulta en PostgreSQL


Estoy tratando de hacer algo como esto en postgres:

  • UPDATE table1 SET (col1, col2) = (SELECT col2, col3 FROM othertable WHERE othertable.col1 = 123);

  • INSERT INTO table1 (col1, col2) VALUES (SELECT col1, col2 FROM othertable)

Pero el punto 1 no es posible incluso con postgres 9.0 como se menciona en los documentos ( http://www.postgresql.org/docs/9.0/static/sql-update.html )

También el punto 2 parece no funcionar. estoy recibiendo el siguiente error: subconsulta debe devolver solo una columna.

Espero que alguien tenga una solución para mí. de lo contrario, las consultas tardarán mucho tiempo :(.

Para su información: Estoy tratando de seleccionar diferentes columnas de varias tablas y almacenarlas en una tabla temporal, para que otra aplicación pueda obtener fácilmente los datos preparados.

Author: Juan Mellado, 2010-09-17

3 answers

Para la ACTUALIZACIÓN

Uso:

UPDATE table1 
   SET col1 = othertable.col2,
       col2 = othertable.col3 
  FROM othertable 
 WHERE othertable.col1 = 123;

Sustitúyase

Uso:

INSERT INTO table1 (col1, col2) 
SELECT col1, col2 
  FROM othertable

No necesita la sintaxis VALUES si está utilizando un SELECT para rellenar los valores de INSERCIÓN.

 141
Author: OMG Ponies,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-17 16:14:36
UPDATE table1 SET (col1, col2) = (col2, col3) FROM othertable WHERE othertable.col1 = 123;
 12
Author: Walter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-12-15 21:09:17

La respuesta de OMG Ponies funciona perfectamente, pero en caso de que necesite algo más complejo, aquí hay un ejemplo de una consulta de actualización ligeramente más avanzada:

UPDATE table1 
SET col1 = subquery.col2,
    col2 = subquery.col3 
FROM (
    SELECT t2.foo as col1, t3.bar as col2, t3.foobar as col3 
    FROM table2 t2 INNER JOIN table3 t3 ON t2.id = t3.t2_id
    WHERE t2.created_at > '2016-01-01'
) AS subquery
WHERE table1.id = subquery.col1;
 11
Author: David Namenyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-15 19:34:04