सेट ऑपरेटर्स का उपयोग करना

सेट संचालकों का उपयोग दो (या अधिक) चयनित बयानों के परिणामों में शामिल होने के लिए किया जाता है। Oracle 11g में उपलब्ध सेट ऑपरेटर UNION, UNION ALL, INTERSECT, और MINUS हैं।

UNION सेट ऑपरेटर दो सेलेक्ट स्टेटमेंट्स के संयुक्त परिणाम देता है। संभावित रूप से, यह परिणामों से डुप्लिकेट को हटाता है अर्थात केवल एक पंक्ति को प्रत्येक डुप्लिकेट किए गए परिणाम के लिए सूचीबद्ध किया जाएगा। इस व्यवहार का मुकाबला करने के लिए, UNION सभी सेट ऑपरेटर का उपयोग करें जो डुप्लिकेट को बनाए रखता है अंतिम परिणाम.इंटरसेक्ट केवल उन रिकॉर्डों को सूचीबद्ध करता है जो दोनों चयनित प्रश्नों के लिए सामान्य हैं; MINUS सेट ऑपरेटर आउटपुट से दूसरी क्वेरी के परिणाम निकालता है यदि वे पहले क्वेरी के परिणामों में भी पाए जाते हैं। इंटरसेक्ट और माइनस सेट ऑपरेशंस में अनचाहे परिणाम सामने आते हैं।

सभी SET ऑपरेटर्स उनके बीच पूर्व की समान डिग्री साझा करते हैं। इसके अलावा, क्वेरी के निष्पादन के दौरान, Oracle बाएं से दाएं या ऊपर से नीचे तक मूल्यांकन शुरू करता है। यदि स्पष्ट रूप से कोष्ठक का उपयोग किया जाता है, तो आदेश अलग-अलग हो सकते हैं क्योंकि कोष्ठक पर प्राथमिकता दी जाएगी। झूलने वाले परिचालक।

याद दिलाने के संकेत -

  • सभी भाग लेने वाले सेलेक्ट स्टेटमेंट द्वारा समान संख्या में कॉलम का चयन किया जाना चाहिए। प्रदर्शन में उपयोग किए जाने वाले कॉलम नाम पहली क्वेरी से लिए गए हैं।

  • स्तंभ सूची के डेटा प्रकारों को ऑरेकल द्वारा संगत / अंतर्निहित रूप से परिवर्तनीय होना चाहिए। यदि घटक प्रश्नों में संबंधित कॉलम अलग-अलग डेटा प्रकार समूहों से संबंधित है, तो ओरेकल अंतर्निहित प्रकार का रूपांतरण नहीं करेगा। उदाहरण के लिए, यदि पहले घटक क्वेरी में एक स्तंभ डेटा प्रकार DATE का है, और दूसरे घटक क्वेरी में संबंधित स्तंभ डेटा का है CHAR टाइप करें, ओरेकल निहित रूपांतरण नहीं करेगा, लेकिन ORA-01790 त्रुटि बढ़ाएगा।

  • परिणाम सेट को सॉर्ट करने के लिए स्थितीय क्रम का उपयोग किया जाना चाहिए। सेट ऑपरेटरों के साथ व्यक्तिगत परिणाम सेट ऑर्डर की अनुमति नहीं है। ORDER BY क्वेरी के अंत में एक बार दिखाई दे सकता है। उदाहरण के लिए,

  • UNION और INTERSECT ऑपरेटर्स कम्यूटेटिव हैं, अर्थात प्रश्नों का क्रम महत्वपूर्ण नहीं है; यह अंतिम परिणाम नहीं बदलता है।

  • प्रदर्शन के अनुसार, UNION ALL, UNION की तुलना में बेहतर प्रदर्शन दिखाता है क्योंकि डुप्लिकेट को फ़िल्टर करने और परिणाम सेट को सॉर्ट करने में संसाधन व्यर्थ नहीं जाते हैं।

  • सेट ऑपरेटर उप प्रश्नों का हिस्सा हो सकता है।

  • सेट ऑपरेटर्स का उपयोग TABLE संग्रहण अभिव्यक्तियों वाले सेलेक्ट स्टेटमेंट में नहीं किया जा सकता है।

  • सेट ऑपरेटर्स में उपयोग के लिए LONG, BLOB, CLOB, BFILE, VARRAY, या नेस्टेड टेबल की अनुमति नहीं है। सेट ऑपरेटरों के साथ अपडेट क्लॉज की अनुमति नहीं है।

संघ

जब एकाधिक चयन क्वेरी UNION ऑपरेटर का उपयोग कर शामिल हो जाती हैं, तो Oracle NULL मानों की अनदेखी किए बिना, सभी डुप्लिकेट्स को हटाकर और सॉर्ट किए गए क्रम (डिफ़ॉल्ट रूप से आरोही) के बाद, सभी मिश्रित चयनित क्वेरीज़ से संयुक्त परिणाम प्रदर्शित करता है।

UNION ऑपरेटर का उपयोग करके शामिल किए गए नीचे दिए गए पाँच प्रश्नों पर विचार करें। अंतिम संयुक्त परिणाम सेट में सभी SQL से मूल्य शामिल हैं। डेटा के दोहराव को हटाने और छँटाई पर ध्यान दें।

SELECT 1 NUM FROM DUAL
UNION
SELECT 5 FROM DUAL 
UNION
SELECT 3 FROM DUAL
UNION
SELECT 6 FROM DUAL
UNION
SELECT 3 FROM DUAL;

NUM
-------
1
3
5
6

ध्यान देने के लिए, चयनित प्रश्नों में चयनित कॉलम संगत डेटा प्रकार का होना चाहिए। जब नियम का उल्लंघन किया जाता है, तो Oracle एक त्रुटि संदेश फेंकता है।

SELECT TO_DATE('12-OCT-03') FROM DUAL
UNION
SELECT '13-OCT-03' FROM DUAL;

SELECT TO_DATE('12-OCT-03') FROM DUAL
       *
ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression

यूनिअन ऑल

UNION और UNION ALL अपने कामकाज में थोड़े अंतर के साथ समान हैं। लेकिन UNION ALL परिणाम दोहराव को हटाए बिना और डेटा को सॉर्ट किए बिना सेट करता है। उदाहरण के लिए, उपरोक्त क्वेरी में UNION को प्रभाव को देखने के लिए UNION ALL द्वारा प्रतिस्थापित किया जाता है।

UNION सेक्शन में प्रदर्शित क्वेरी पर विचार करें। आउटपुट में अंतर को नोट करें जो बिना छंटनी और कटौती के उत्पन्न होता है।

SELECT 1 NUM FROM DUAL
UNION ALL
SELECT 5 FROM DUAL 
UNION ALL
SELECT 3 FROM DUAL
UNION ALL
SELECT 6 FROM DUAL
UNION ALL
SELECT 3 FROM DUAL;

NUM
-------
1
5
3
6
3

एक दूसरे को काटना

INTERSECT ऑपरेटर का उपयोग करते हुए, Oracle उन दोनों चयन कथनों में से सामान्य पंक्तियों को प्रदर्शित करता है, जिनमें कोई डुप्लिकेट और डेटा क्रमबद्ध क्रम में व्यवस्थित नहीं है (डिफ़ॉल्ट रूप से आरोही)।

उदाहरण के लिए, नीचे चयनित क्वेरी वेतन को प्राप्त करती है जो विभाग 10 और 20 में आम है। आईएसओ एसक्यूएल मानकों के अनुसार, सेट ऑपरेटर्स के मूल्यांकन की पूर्वता में दूसरों से ऊपर है, लेकिन यह अभी भी ओरेकल द्वारा शामिल नहीं है।

SELECT SALARY
FROM employees
WHERE DEPARTMENT_ID = 10
INTRESECT
SELECT SALARY 
FROM employees
WHERE DEPARTMENT_ID = 20

SALARY
---------
1500
1200
2000

ऋण

माइनस ऑपरेटर उन पंक्तियों को प्रदर्शित करता है जो पहली क्वेरी में मौजूद हैं लेकिन दूसरी क्वेरी में अनुपस्थित हैं, जिसमें कोई डुप्लिकेट और डेटा डिफ़ॉल्ट रूप से आरोही क्रम में व्यवस्थित नहीं है।

SELECT JOB_ID
FROM employees
WHERE DEPARTMENT_ID = 10
MINUS
SELECT JOB_ID
FROM employees
WHERE DEPARTMENT_ID = 20;

JOB_ID
-------------        
HR
FIN
ADMIN

सेलेक्ट स्टेटमेंट का मिलान करना

ऐसे परिदृश्य हो सकते हैं जहां मिश्रित चयन कथन में अलग-अलग गणना और चयनित कॉलम के डेटा प्रकार हो सकते हैं। इसलिए, कॉलम सूची को स्पष्ट रूप से मिलान करने के लिए, NULL कॉलम को गुम स्थितियों में डाला जाता है, ताकि प्रत्येक SELECT स्टेटमेंट में चयनित कॉलमों की गिनती और डेटा प्रकार से मिलान हो सके। संख्या स्तंभों के लिए, शून्य को क्वेरी में चुने गए स्तंभों के प्रकार से मेल करने के लिए प्रतिस्थापित किया जा सकता है।

नीचे दिए गए प्रश्न में, कर्मचारी का नाम (varchar2) और स्थान आईडी (संख्या) का डेटा प्रकार मेल नहीं खाता है। इसलिए, संगतता समस्या के कारण निम्न क्वेरी का निष्पादन त्रुटि उत्पन्न करेगा।

SELECT DEPARTMENT_ID "Dept", first_name "Employee"
FROM employees
UNION
SELECT DEPARTMENT_ID, LOCATION_ID
FROM departments;

ERROR at line 1:
ORA-01790: expression must have same datatype as corresponding expression

स्पष्ट रूप से, स्थान आईडी और कर्मचारी के नाम के लिए NULL को प्रतिस्थापित करके स्तंभों का मिलान किया जा सकता है।

SELECT DEPARTMENT_ID "Dept", first_name "Employee", NULL "Location"
FROM employees
UNION
SELECT DEPARTMENT_ID, NULL "Employee", LOCATION_ID
FROM departments;

सेट संचालन में खंड द्वारा आदेश का उपयोग करना

ORDER BY क्लॉज केवल एक बार कंपाउंड सेलेक्ट स्टेटमेंट वाले क्वैरी के अंत में दिखाई दे सकता है। इसका मतलब है कि व्यक्तिगत SELECT स्टेटमेंट्स ORDER BY क्लॉज नहीं हो सकता है। इसके अतिरिक्त, छँटाई उन स्तंभों पर आधारित हो सकती है जो केवल पहले चयन क्वेरी में दिखाई देते हैं। इस कारण से, स्तंभ स्थितियों का उपयोग करके यौगिक क्वेरी को सॉर्ट करने की अनुशंसा की जाती है।

नीचे दी गई कंपाउंड क्वेरी दो विभागों के परिणामों को एकीकृत करती है और SALARY कॉलम द्वारा छांटती है।

SELECT employee_id, first_name, salary
FROM employees
WHERE department_id=10
UNION
SELECT employee_id, first_name, salary
FROM employees
WHERE department_id=20
ORDER BY 3;