Вот минимальный пример моей реальной проблемы:
create table t(id serial primary key, rnd double precision);
Конечно, вы можете вернуть вставленные столбцы с returning
предложением:
with w as (insert into t(rnd) values(random()) returning *)
insert into t(rnd) select random() from w returning *;
/*
| ID | RND |
|----|----------------|
| 9 | 0.203221440315 |
*/
Вы также можете вернуть литерал:
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 |
*/
но вы не можете вернуть исходные столбцы:
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
*/
Есть ли какой-нибудь способ, которым я могу выйти w.rnd
из последнего returning
пункта?
дБ <> скрипка здесь
postgresql
postgresql-9.6
Джек говорит, попробуйте topanswers.xyz
источник
источник
UPDATE
в этом связанном ответе на SO , но это не сработаетINSERT
.Ответы:
Документация по
RETURNING
пункту гласит:Это явно не относится к столбцам из другой таблицы.
Хотя я не совсем понимаю суть проблемы (то есть, почему вы это делаете - я думаю, это потому, что это слишком абстрактная версия оригинала), возможное решение может быть:
То есть вы можете поместить более одного доступного для записи CTE в начало запроса. Пожалуйста, посмотрите это в действии на dbfiddle .
источник