Aquí hay un ejemplo mínimo de mi problema del mundo real:
create table t(id serial primary key, rnd double precision);
por supuesto, puede devolver las columnas insertadas con una returningcláusula:
with w as (insert into t(rnd) values(random()) returning *)
insert into t(rnd) select random() from w returning *;
/*
| ID | RND |
|----|----------------|
| 9 | 0.203221440315 |
*/
También puede devolver un literal:
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 |
*/
pero no puede devolver las columnas de origen:
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
*/
¿Hay alguna forma de w.rndsalir de la returningcláusula final ?
db <> violín aquí
postgresql
postgresql-9.6
Jack dice que intente topanswers.xyz
fuente
fuente

UPDATEen esta respuesta relacionada en SO , pero esto no funcionaráINSERT.Respuestas:
La documentación en la
RETURNINGcláusula dice:Esto claramente no se aplica a las columnas de otra tabla.
Aunque realmente no entiendo el punto del problema (es decir, por qué haces esto, me imagino que es porque es una versión demasiado abstracta del original), una posible solución puede ser:
Es decir, puede colocar más de un CTE grabable al comienzo de una consulta. Por favor, vea esto en acción en dbfiddle .
fuente