'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.