Mise à jour ou insertion (plusieurs lignes et colonnes) de la sous-requête dans PostgreSQL

J’essaie de faire quelque chose comme ça dans les postgres:

Mais le point 1 n’est pas possible même avec postgres 9.0 comme mentionné dans les documents ( http://www.postgresql.org/docs/9.0/static/sql-update.html )

De plus, le point 2 ne semble pas fonctionner. Je reçois l’erreur suivante: la sous-requête ne doit renvoyer qu’une seule colonne.

J’espère que quelqu’un a une solution de rechange pour moi. sinon les requêtes prendront du temps :(.

FYI: J’essaie de sélectionner différentes colonnes de plusieurs tables et de les stocker dans une table temporaire, afin qu’une autre application puisse facilement récupérer les données préparées.

Pour la mise à jour

Utilisation:

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

Pour l’INSERT

Utilisation:

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

Vous n’avez pas besoin de la syntaxe VALUES si vous utilisez un SELECT pour remplir les valeurs INSERT.

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

La réponse d’OMG Ponies fonctionne parfaitement, mais juste au cas où vous auriez besoin de quelque chose de plus complexe, voici un exemple d’une requête de mise à jour légèrement plus avancée:

 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;