2017-03-25 6 views
1

J'essaie d'obtenir une valeur obtenue à partir d'un SELECT, puis INSERT cette valeur, ainsi que d'autres valeurs, dans une autre table:PostgreSQL n'accepte pas INSERT avec VALUES et FROM?

WITH data AS (SELECT name FROM programmes WHERE id = $1) 
INSERT INTO purchases (name, other_details, some_more_stuff) 
VALUES (data.name, $2, $3) FROM data; 

Mais PostgreSQL donne 42601 ERROR: syntax error at or near "FROM" LINE 1: ...(data.name, $2, $3) FROM data.

INSERT ne donne aucun exemple de VALUES et FROM ensemble dans la même requête. Quelle est la syntaxe correcte pour ce type de requête? Ou n'est-il pas possible d'exprimer ma requête de cette manière?

Répondre

4

Vous n'avez pas besoin d'une expression de table commune.

INSERT INTO purchases (name, other_details, some_more_stuff) 
SELECT name, $2, $3 
FROM programmes 
WHERE id = $1 

La syntaxe que vous avez essayé d'appliquer est incorrecte. Vous ne pouvez pas utiliser les colonnes d'une table ou d'une requête dans la liste VALUES, car la liste doit contenir uniquement des constantes. De the documentation (italique ajouté):

VALEURS fournit un moyen de générer une « table de constante » qui peut être utilisé dans une requête sans avoir à réellement créer et remplir une table sur disque.

Voir aussi VALUES syntax.

2

Utilisation insert . . . select:

WITH data AS (
     SELECT name 
     FROM programmes 
     WHERE id = $1 
    ) 
INSERT INTO purchases (name, other_details, some_more_stuff) 
    SELECT data.name, $2, $3 
    FROM data; 

Il est non seulement Postgres. C'est ainsi que fonctionne SQL. Pour être honnête, je ne pense pas apprendre insert . . . values est particulièrement utile, parce que vous pouvez tout faire et plus en utilisant insert . . . select. (Bien, sauf si vous utilisez MS Access qui n'autorise pas les sous-requêtes "constantes".)