WITH
आपको SELECT
क्वेरी में उपयोग के लिए "अस्थायी तालिकाओं" को परिभाषित करने देता है। उदाहरण के लिए, मैं हाल ही में इस तरह एक प्रश्न लिखा था, दो सेट के बीच परिवर्तन की गणना करने के:
-- Let o be the set of old things, and n be the set of new things.
WITH o AS (SELECT * FROM things(OLD)),
n AS (SELECT * FROM things(NEW))
-- Select both the set of things whose value changed,
-- and the set of things in the old set but not in the new set.
SELECT o.key, n.value
FROM o
LEFT JOIN n ON o.key = n.key
WHERE o.value IS DISTINCT FROM n.value
UNION ALL
-- Select the set of things in the new set but not in the old set.
SELECT n.key, n.value
FROM o
RIGHT JOIN n ON o.key = n.key
WHERE o.key IS NULL;
शीर्ष पर "टेबल" को परिभाषित करने o
और n
, मैं भाव things(OLD)
और things(NEW)
दोहराने से बचें करने में सक्षम था।
निश्चित रूप से, हम शायद को FULL JOIN
का उपयोग करके समाप्त कर सकते हैं, लेकिन मैं अपने विशेष मामले में ऐसा करने में सक्षम नहीं था।
अगर मैं आपकी क्वेरी सही ढंग से समझ, यह करता है यह:
मुझे नहीं लगता कि WITH
आपके मामले में कुछ भी सरल करेगा। यह थोड़ा और अधिक एक FROM
खंड का उपयोग करने के सुरुचिपूर्ण है, हालांकि हो सकता है:
update global.prospect psp
set status = status || '*'
from (select psp_id
from global.prospect
where status = 'new' or status = 'reset'
order by request_ts
limit 1
) p2
where psp.psp_id = p2.psp_id
returning psp.*;
untested है। अगर यह काम करता है तो मुझे बताएं।
यह काफी वास्तव में क्या आप पहले से ही है, को छोड़कर है:
यह आसानी से अनेक पंक्तियां अपडेट करने के लिए बढ़ाया जा सकता है। आपके संस्करण में, जो सबक्वायरी अभिव्यक्ति का उपयोग करता है, यदि क्वेरी कई पंक्तियों को उत्पन्न करने के लिए बदल जाती है तो क्वेरी विफल हो जाएगी।
मैंने subquery में global.prospect
उपनाम नहीं किया था, इसलिए इसे पढ़ने में थोड़ा आसान है। चूंकि यह FROM
खंड का उपयोग करता है, इसलिए यदि आप गलती से तालिका को अपडेट किया जा रहा है तो आपको एक त्रुटि मिलेगी।
आपके संस्करण में, सबकुरी अभिव्यक्ति प्रत्येक आइटम के लिए सामने आती है। हालांकि PostgreSQL को इसे अनुकूलित करना चाहिए और केवल एक बार अभिव्यक्ति का मूल्यांकन करना चाहिए, यदि आप गलती से psp
में कॉलम का संदर्भ देते हैं या अस्थिर अभिव्यक्ति जोड़ते हैं तो यह अनुकूलन दूर हो जाएगा।
स्रोत
2012-01-04 04:06:02
प्रलेखन के अनुसार, 'IN [RECURSIVE] '' INSERT' और 'UPDATE' कथन का उपयोग करके PostgreSQL 9.1 में जोड़ा गया था। –
@ जॉयएडम्स - डीएमएल के साथ उपयोग - प्याज की एक और परत –