'returning'절이 삽입되지 않은 소스 열을 반환 할 수 있습니까?


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 문만 추가 열을 리턴 할 수 있습니다. 어쩌면 postgres에서도 작동합니다.
Sebastian Meine

SO에 대한 관련 답변에서 비슷한 문제를UPDATE 해결 했지만이 기능은 작동하지 않습니다 INSERT.
Erwin Brandstetter

답변:


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 에 대한 조치를 참조하십시오 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.