WITH
क्लॉज सबक्वेरी फैक्टरिंग के लिए है, जिसे सामान्य टेबल एक्सप्रेशन या सीटीई के रूप में भी जाना जाता है:
WITH query_name क्लॉज आपको एक सबक्वेरी ब्लॉक को एक नाम असाइन करने देता है। फिर आप query_name निर्दिष्ट करके सबक्वायरी ब्लॉक एकाधिक स्थानों को क्वेरी में संदर्भित कर सकते हैं। Oracle डेटाबेस क्वेरी नाम को इनलाइन दृश्य या अस्थायी तालिका के रूप में मानकर क्वेरी को अनुकूलित करता है।
आपके दूसरे उदाहरण में, जिसे आपने temp_table
कहा है एक इनलाइन दृश्य है, अस्थायी तालिका नहीं है।
कई मामलों में उपयोग करने का विकल्प आपकी पसंदीदा शैली पर निर्भर करता है, और सीटीई विशेष रूप से उपश्रेणियों के कई स्तरों के साथ कोड को और अधिक पठनीय बना सकते हैं (राय निश्चित रूप से भिन्न होते हैं)। यदि आप सीटीई/इनलाइन दृश्य केवल तभी देखें जब आपको शायद प्रदर्शन में कोई अंतर दिखाई न दे, और ऑप्टिमाइज़र उसी योजना के साथ समाप्त हो सकता है।
वे विशेष रूप से तब उपयोगी होते हैं जब आपको एक ही सबक्वायरी को एक से अधिक स्थानों पर उपयोग करने की आवश्यकता होती है, जैसे कि एक संघ में। आप एक इनलाइन दृश्य को एक सीटीई में खींच सकते हैं ताकि कोड दोहराया न जाए, और यह ऑप्टिमाइज़र को इसे अमल में लाने की अनुमति देता है यदि उसे लगता है कि यह फायदेमंद होगा।
उदाहरण के लिए, यह काल्पनिक उदाहरण:
select curr from (
select curr from tableone t1
left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr >= 0
union all
select -1 * curr from (
select curr from tableone t1
left join tabletwo t2 on (t1.empid = t2.empid)
) temp_table
where curr < 0
के लिए पुन:सक्रिय किया जा सकता है:
with temp_table as (
select curr from tableone t1
left join tabletwo t2 on (t1.empid = t2.empid)
)
select curr from temp_table
where curr >= 0
union all
select -1 * curr from temp_table
where curr < 0
सबक्वेरी को अब दोहराया नहीं जाना है। दोहराया कोड जितना अधिक जटिल होता है, रखरखाव के दृष्टिकोण से सीटीई का उपयोग करना उतना ही अधिक फायदेमंद होता है। और सबक्वायरी जितनी महंगी होगी उतना ही अधिक प्रदर्शन लाभ आपको कर सकता है एक सीटीई का उपयोग करने से देखें, हालांकि ऑप्टिमाइज़र आमतौर पर यह पता लगाने में बहुत अच्छा होता है कि आप क्या कर रहे हैं।