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 returning
clá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.rnd
salir de la returning
cláusula final ?
db <> violín aquí
postgresql
postgresql-9.6
Jack dice que intente topanswers.xyz
fuente
fuente
UPDATE
en esta respuesta relacionada en SO , pero esto no funcionaráINSERT
.Respuestas:
La documentación en la
RETURNING
clá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