क्या 'रिटर्निंग' क्लॉज रिटर्न सोर्स कॉलम में डाला जा सकता है?


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 <> यहाँ fiddle


MS SQL सर्वर में केवल 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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.