Чи може стаття "повернення" повертати стовпці джерела, які не вставлені?


14

Ось мінімальний приклад моєї проблеми в реальному світі:

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пункту?

db <> скрипка тут


У MS SQL Server лише оператор MERGE дозволяє повернути додаткові стовпці. Можливо, це підійде і для постгресів.
Себастьян Мейн

Відповіді:


12

Документація цього RETURNINGпункту говорить:

Вираз, який слід обчислити та повернути командою INSERT після введення кожного рядка. Вираз може використовувати будь-які назви стовпців таблиці, названих іменем table_name. Напишіть *, щоб повернути всі стовпці вставлених рядків.

Це явно не стосується стовпців з іншої таблиці.

Хоча я насправді не розумію проблеми (тобто чому ви це робите - я думаю, це так, бо це занадто абстрактна версія оригінальної), можливим рішенням може бути:

WITH w AS (INSERT INTO t(rnd) VALUES (random()) RETURNING *),
     x AS (INSERT INTO t(rnd) SELECT random() FROM w RETURNING *)
SELECT w.rnd, x.rnd
  FROM w, x;

Тобто до початку запиту можна поставити більше одного CTE, що можна записати. Будь ласка, дивіться це в дії на dbfiddle .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.