2013-12-13 8 views
12

में काम करता है मैंने एक स्पष्टीकरण के लिए पूरी तरह से देखा है, एक चुनिंदा कथन में सबक्वायरी कैसे काम करती है और फिर भी मैं बहुत अस्पष्ट स्पष्टीकरण के कारण अवधारणा को समझ नहीं पा रहा हूं।चुनिंदा कथन में सबक्वायरी ऑरैकल

मैं जानना चाहता हूं कि आप ऑरैकल में एक चुनिंदा कथन में एक सबक्वायरी का उपयोग कैसे करते हैं और यह वास्तव में आउटपुट क्या करता है।

उदाहरण के लिए, अगर मैं एक प्रश्न है कि इन तालिकाओं

कर्मचारी (EmpName, EmpId)

प्रोफाइल (ProfileId से कर्मचारियों के नाम और प्रोफ़ाइल की संख्या उनके द्वारा प्रबंधित प्रदर्शित करने के लिए करना चाहता था था, .. ।, EmpId)

मैं सबक्वायरी का उपयोग कैसे करूं?

मैं सोच रहा था कि प्रत्येक कर्मचारी के लिए प्रबंधित प्रोफाइल की संख्या की गणना करने के लिए समूह द्वारा कार्यान्वित करने के लिए चयन कथन में एक सबक्वायरी की आवश्यकता है, लेकिन मुझे पूरा यकीन नहीं है।

उत्तर

18

यह सरल

SELECT empname, 
     empid, 
     (SELECT COUNT (profileid) 
      FROM profile 
     WHERE profile.empid = employee.empid) 
      AS number_of_profiles 
    FROM employee; 

यह और भी आसान है जब आप एक तालिका इस तरह शामिल होने का उपयोग करें:

SELECT e.empname, e.empid, COUNT (p.profileid) AS number_of_profiles 
    FROM employee e LEFT JOIN profile p ON e.empid = p.empid 
GROUP BY e.empname, e.empid; 

सबक्वेरी के लिए स्पष्टीकरण:

अनिवार्य रूप से, select में एक सबक्वायरी एक स्केलर मान प्राप्त करता है और इसे मुख्य प्रश्न में भेजता है। select में एक सबक्वायरी को एक से अधिक पंक्तियों और एक से अधिक स्तंभों को पारित करने की अनुमति नहीं है, जो एक प्रतिबंध है। यहां, हम मुख्य क्वेरी में count पास कर रहे हैं, जैसा कि हम जानते हैं, हमेशा एक संख्या-एक स्केलर मान होगा। यदि कोई मान नहीं मिलता है, तो सबक्वायरी मुख्य क्वेरी में null लौटाता है। इसके अलावा, एक उपक्वायर मुख्य क्वेरी के from खंड से कॉलम तक पहुंच सकता है, जैसा कि मेरी क्वेरी में दिखाया गया है कि employee.empid बाहरी क्वेरी से आंतरिक क्वेरी में पारित किया गया है।


संपादित:

आप एक select खंड में एक सबक्वेरी का उपयोग करते हैं, ओरेकल अनिवार्य रूप से यह एक छोड़ दिया के रूप में मानता में शामिल होने के (आप आपकी क्वेरी के लिए explain plan में देख सकते हैं) की प्रमुखता के साथ पंक्तियां बाईं ओर हर पंक्ति के लिए दाईं तरफ सिर्फ एक हैं। बाईं के लिए


स्पष्टीकरण में शामिल होने

एक बाएं में शामिल होने के बहुत आसान है, खासकर जब आप अपने प्रतिबंधों की वजह से select सबक्वेरी बदलना चाहते हैं। LEFT JOIN कीवर्ड के दोनों तरफ टेबल की पंक्तियों की संख्या पर यहां कोई प्रतिबंध नहीं हैं।

अधिक जानकारी के लिए Oracle Docs on subqueries और left join or left outer join पढ़ें।

+0

बहुत बहुत धन्यवाद! यह वास्तव में मदद की। हालांकि एक सवाल है। आपने कहा कि सबक्वायरी को एक से अधिक कॉलम पास करने की अनुमति नहीं है, इसका मतलब है कि अगर मैं एक एसयूएम फ़ंक्शन जोड़ना चाहता हूं, तो मुझे एक और सबक्वायरी का उपयोग करना होगा? या चयन में subquery से अधिक होना संभव है? – user3054901

+0

हां। आप एक चयन सूची में एकाधिक subqueries का उपयोग कर सकते हैं। एसयूएम फ़ंक्शन जोड़ने के लिए आपको एक और सबक्वायरी का उपयोग करना होगा। – Rachcha

+0

आपकी मदद के लिए धन्यवाद :) – user3054901

0

ओरेकल आरडीबीएमएस में, चयन खंड में बहु-पंक्ति सबक्वायरी का उपयोग करना संभव है जब तक कि (उप-) आउटपुट संग्रह के रूप में encapsulated है।विशेष रूप से, एक बहु-पंक्ति चयन खंड सबक्वायरी प्रत्येक पंक्तियों को xmlelement के रूप में आउटपुट कर सकता है जो xmlforest में encapsulated है।

संबंधित मुद्दे