J'essaie de faire quelque chose comme ça dans 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)
Mais le point 1 n’est pas possible même avec postgres 9.0 comme mentionné dans la documentation ( http://www.postgresql.org/docs/9.0/static/sql-update.html )
Aussi le point 2 semble ne pas fonctionner. Je reçois l'erreur suivante: la sous-requête ne doit renvoyer qu'une colonne.
J'espère que quelqu'un a une solution de contournement pour moi. sinon, les requêtes prendront du temps :(.
Pour votre information: j'essaie de sélectionner différentes colonnes de plusieurs tables et de les stocker dans une table temporaire, de sorte qu'une autre application puisse facilement récupérer les données préparées.
Utilisation:
UPDATE table1
SET col1 = othertable.col2,
col2 = othertable.col3
FROM othertable
WHERE othertable.col1 = 123;
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 renseigner les valeurs INSERT.
La réponse de OMG Ponies fonctionne parfaitement, mais juste au cas où vous auriez besoin de quelque chose de plus complexe, voici un exemple de 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;
UPDATE table1 SET (col1, col2) = (col2, col3) FROM othertable WHERE othertable.col1 = 123;