Voici un exemple minimal de mon problème réel:
create table t(id serial primary key, rnd double precision);
bien sûr, vous pouvez renvoyer les colonnes insérées avec une returning
clause:
with w as (insert into t(rnd) values(random()) returning *)
insert into t(rnd) select random() from w returning *;
/*
| ID | RND |
|----|----------------|
| 9 | 0.203221440315 |
*/
vous pouvez également retourner un littéral:
with w as (insert into t(rnd) values(random()) returning *)
insert into t(rnd) select random() from w returning *, 1.0 dummy;
/*
| ID | RND | DUMMY |
|----|----------------|-------|
| 11 | 0.594980469905 | 1 |
*/
mais vous ne pouvez pas renvoyer les colonnes source:
with w as (insert into t(rnd) values(random()) returning *)
insert into t(rnd) select random() from w returning *, w.rnd;
/*
ERROR: missing FROM-clause entry for table "w": with w as (insert into t(rnd) values(random()) returning *) insert into t(rnd) select random() from w returning *, w.rnd
*/
Existe-t-il un moyen de w.rnd
sortir de la returning
clause finale ?
db <> violon ici
postgresql
postgresql-9.6
Jack dit d'essayer topanswers.xyz
la source
la source
UPDATE
dans cette réponse connexe sur SO , mais cela ne fonctionnera pasINSERT
.Réponses:
La documentation sur la
RETURNING
clause dit:Cela ne s'applique clairement pas aux colonnes d'une autre table.
Bien que je ne comprenne pas vraiment le problème (c'est-à-dire pourquoi vous faites cela - j'imagine que c'est parce que c'est une version un peu trop abstraite de l'original), une solution possible peut être:
Autrement dit, vous pouvez placer plusieurs CTE inscriptibles au début d'une requête. Veuillez le voir en action sur dbfiddle .
la source