मूल उत्तर
CTE हैं (सामान्य तालिका भाव) पोस्टग्रेज . में (जैसे MySQL को छोड़कर किसी भी प्रमुख आधुनिक RDBMS में)। संस्करण 9.1 के बाद से जिसमें डेटा-संशोधित सीटीई शामिल हैं। वे "नेस्टेड" हो सकते हैं।
अपडेट:MySQL 8.0 अंत में सीटीई जोड़ता है।
उपश्रेणियों के विपरीत सीटीई अनुकूलन बाधाओं के रूप में प्रस्तुत करते हैं। क्वेरी प्लानर मुख्य कमांड में तुच्छ कमांड को इनलाइन नहीं कर सकता है या मुख्य क्वेरी और सीटीई के बीच फिर से जुड़ता है। सबक्वेरी के साथ भी ऐसा ही संभव है। प्रदर्शन के लिए (बहुत) अच्छा या (बहुत) बुरा हो सकता है, यह निर्भर करता है।
किसी भी तरह से, CTE को सबक्वेरी की तुलना में थोड़ा अधिक ओवरहेड (प्रदर्शन लागत) की आवश्यकता होती है।
अपडेट:पोस्टग्रेज 12 अंततः सादे CTE को इनलाइन कर सकता है मुख्य प्रश्न में।
विवरण जो आपने नहीं मांगा
आपका प्रश्न बहुत ही बुनियादी है, शायद उपरोक्त उत्तर देने के लिए पर्याप्त है। लेकिन मैं उन्नत उपयोगकर्ताओं के लिए थोड़ा जोड़ूंगा (और सिंटैक्स दिखाने के लिए एक कोड उदाहरण)।
किसी क्वेरी के सभी CTE समान स्नैपशॉट . पर आधारित होते हैं डेटाबेस का। अगला सीटीई आउटपुट का पुन:उपयोग कर सकता है पिछले सीटीई (आंतरिक अस्थायी टेबल) के, लेकिन अन्य सीटीई के लिए अंतर्निहित तालिकाओं पर प्रभाव अदृश्य हैं। कई सीटीई का क्रम मनमाना है जब तक RETURNING
के साथ कुछ लौटाया जाता है INSERT
. के लिए क्लॉज , UPDATE
, DELETE
- SELECT
. के लिए अप्रासंगिक , चूंकि यह कुछ भी नहीं बदलता है और केवल स्नैपशॉट से पढ़ता है।
इसमें कई अपडेट के साथ सूक्ष्म प्रभाव हो सकते हैं जो एक ही पंक्ति को प्रभावित कर रहे होंगे। केवल एक अद्यतन प्रत्येक पंक्ति को प्रभावित कर सकता है। सीटीई के अनुक्रम से कौन सा प्रभावित होता है।
परिणाम की भविष्यवाणी करने का प्रयास करें:
CREATE TEMP TABLE t (t_id int, txt text);
INSERT INTO t VALUES (1, 'foo'), (2, 'bar'), (3, 'baz');
WITH sel AS (SELECT * FROM t)
, up1 AS (UPDATE t SET txt = txt || '1' WHERE t_id = 1 RETURNING *)
, up2 AS (UPDATE t SET txt = t.txt || '2'
FROM up1
WHERE up1.t_id = t.t_id
RETURNING t.*)
, ins AS (INSERT INTO t VALUES (4, 'bamm'))
, up3 AS (UPDATE t SET txt = txt || '3' RETURNING *)
SELECT 'sel' AS source, * FROM sel
UNION ALL
SELECT 'up1' AS source, * FROM up1
UNION ALL
SELECT 'up2' AS source, * FROM up2
UNION ALL
SELECT 'up3' AS source, * FROM up3
UNION ALL
SELECT 't' AS source, * FROM t;
एसक्यूएल फिडल
निराश न हों, मुझे संदेह है कि यहां बहुत से लोग हैं जो ऐसा कर सकते थे। :)
इसका सार:से बचें सीटीई में परस्पर विरोधी आदेश।