'Return' yantümcesi eklenmemiş kaynak sütunlarını döndürebilir mi?


14

İşte benim gerçek dünya sorunumun minimal bir örneği:

create table t(id serial primary key, rnd double precision);

tabiki eklenen sütunları bir returningcümle ile döndürebilirsiniz :

with w as (insert into t(rnd) values(random()) returning *)
insert into t(rnd) select random() from w returning *;
/*
| ID |            RND |
|----|----------------|
|  9 | 0.203221440315 |
*/

bir değişmez değeri de döndürebilirsiniz:

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 |
*/

ancak kaynak sütunları döndüremezsiniz:

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.rndSon returningfıkradan çıkabilmemin bir yolu var mı ?

burada keman


MS SQL Server'da yalnızca MERGE deyimi ek sütunların döndürülmesine izin verir. Belki bu postgres için de işe yarayacaktır.
— Sebastian Meine

Ben çözüldü için benzer bir sorun UPDATESO bu ilgili yanıtında , ancak bunun için çalışmaz INSERT.
— Erwin Brandstetter

Yanıtlar:


12

Maddedeki belgeler RETURNINGşöyle diyor:

Her satır eklendikten sonra INSERT komutu tarafından hesaplanacak ve döndürülecek bir ifade. İfade, tablonun table_name adında herhangi bir sütun adını kullanabilir. Eklenen satırların tüm sütunlarını döndürmek için * yazın.

Bu açıkça başka bir tablodaki sütunlar için geçerli değildir.

Sorunun amacını gerçekten almama rağmen (yani bunu neden yapıyorsunuz - bunun orijinalinin biraz soyut bir sürümü olması nedeniyle hayal ediyorum), olası bir çözüm olabilir:

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;

Yani, bir sorgunun başına birden fazla yazılabilir CTE koyabilirsiniz. Lütfen bunu dbfiddle'da çalışırken görün .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.