Oto minimalny przykład mojego problemu w świecie rzeczywistym:
create table t(id serial primary key, rnd double precision);
oczywiście możesz zwrócić wstawione kolumny z returning
klauzulą:
with w as (insert into t(rnd) values(random()) returning *)
insert into t(rnd) select random() from w returning *;
/*
| ID | RND |
|----|----------------|
| 9 | 0.203221440315 |
*/
możesz również zwrócić literał:
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 |
*/
ale nie możesz zwrócić kolumn źródłowych:
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
*/
Czy jest jakiś sposób na w.rnd
wyjście z ostatniej returning
klauzuli?
db <> skrzypce tutaj
postgresql
postgresql-9.6
Jack mówi, że spróbuj topanswers.xyz
źródło
źródło
UPDATE
w tej pokrewnej odpowiedzi dotyczącej SO , ale to nie zadziałaINSERT
.Odpowiedzi:
Dokumentacja
RETURNING
klauzuli mówi:To oczywiście nie dotyczy kolumn z innej tabeli.
Chociaż tak naprawdę nie rozumiem sedna problemu (tj. Dlaczego to robisz - wyobrażam sobie, że dzieje się tak, ponieważ jest to zbyt abstrakcyjna wersja oryginalnej), możliwe rozwiązanie to:
Oznacza to, że na początku zapytania możesz umieścić więcej niż jeden zapis CTE. Zobacz to w akcji na dbfiddle .
źródło