Hier ist ein minimales Beispiel für mein reales Problem:
create table t(id serial primary key, rnd double precision);
Natürlich können Sie die eingefügten Spalten mit einer returning
Klausel zurückgeben:
with w as (insert into t(rnd) values(random()) returning *)
insert into t(rnd) select random() from w returning *;
/*
| ID | RND |
|----|----------------|
| 9 | 0.203221440315 |
*/
Sie können auch ein Literal zurückgeben:
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 |
*/
Sie können die Quellspalten jedoch nicht zurückgeben:
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
*/
Gibt es eine Möglichkeit, w.rnd
aus der Schlussklausel herauszukommen returning
?
db <> hier fummeln
postgresql
postgresql-9.6
Jack Douglas
quelle
quelle
UPDATE
in dieser verwandten Antwort auf SO gelöst , aber das funktioniert nicht fürINSERT
.Antworten:
In der Dokumentation zu dieser
RETURNING
Klausel heißt es:Dies gilt eindeutig nicht für Spalten aus einer anderen Tabelle.
Obwohl ich den Grund des Problems nicht wirklich verstehe (z. B. warum Sie dies tun - ich stelle es mir vor, weil es eine etwas zu abstrakte Version des Originals ist), kann eine mögliche Lösung sein:
Das heißt, Sie können mehr als einen beschreibbaren CTE an den Anfang einer Abfrage setzen. Bitte sehen Sie dies in Aktion an DBFiddle .
quelle