Inilah contoh minimal masalah dunia nyata saya:
create table t(id serial primary key, rnd double precision);
tentu saja Anda dapat mengembalikan kolom yang disisipkan dengan returning
klausa:
with w as (insert into t(rnd) values(random()) returning *)
insert into t(rnd) select random() from w returning *;
/*
| ID | RND |
|----|----------------|
| 9 | 0.203221440315 |
*/
Anda juga dapat mengembalikan 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 |
*/
tetapi Anda tidak dapat mengembalikan kolom sumber:
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
*/
Apakah ada cara saya bisa w.rnd
keluar dari returning
klausa terakhir ?
db <> biola di sini
postgresql
postgresql-9.6
Jack mengatakan coba topanswers.xyz
sumber
sumber
UPDATE
dalam jawaban terkait ini pada SO , tetapi ini tidak akan berhasilINSERT
.Jawaban:
Dokumentasi pada
RETURNING
klausa mengatakan:Ini jelas tidak berlaku untuk kolom dari tabel lain.
Meskipun saya tidak benar-benar mengerti masalahnya (yaitu mengapa Anda melakukan ini - saya bayangkan itu karena versi yang agak terlalu abstrak dari yang asli), solusi yang mungkin adalah:
Artinya, Anda dapat menempatkan lebih dari satu CTE yang dapat ditulis ke awal kueri. Silakan lihat ini beraksi di dbfiddle .
sumber