Aqui está um exemplo mínimo do meu problema do mundo real:
create table t(id serial primary key, rnd double precision);
é claro que você pode retornar as colunas inseridas com uma 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 |
*/
você também pode retornar um 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 |
*/
mas você não pode retornar as colunas de origem:
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 alguma maneira de w.rnd
sair da returning
cláusula final ?
db <> mexer aqui
postgresql
postgresql-9.6
Jack diz que tenta topanswers.xyz
fonte
fonte
UPDATE
nesta resposta relacionada ao SO , mas isso não funcionaráINSERT
.Respostas:
A documentação da
RETURNING
cláusula diz:Isso claramente não se aplica a colunas de outra tabela.
Embora eu realmente não entenda o problema (ou seja, por que você faz isso - eu imagino que seja porque é uma versão um pouco abstrata demais da original), uma solução possível pode ser:
Ou seja, você pode colocar mais de um CTE gravável no início de uma consulta. Por favor, veja isso em ação no dbfiddle .
fonte