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.
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.
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;
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;
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