वेब-आधारित अनुप्रयोगों में टॉप-एन क्वेरीज़ और पेजिनेशन आम है। उपयोगकर्ता मानदंड का एक सेट इनपुट करता है, जो एक क्वेरी चलाता है और फिर उपयोगकर्ता को परिणाम सेट के माध्यम से पृष्ठ पर पिछला और अगला बटन क्लिक करने देता है। इस पेजिंग कार्यक्षमता को प्राप्त करने के लिए, एप्लिकेशन को डेटाबेस क्वेरी से पंक्तियों का एक निश्चित सेट प्राप्त करने में सक्षम होना चाहिए।
आइए Oracle में शीर्ष-N प्रश्नों को प्राप्त करने के लिए Oracle और Oracle क्वेरी में पृष्ठांकन प्राप्त करने के विभिन्न तरीकों पर एक नज़र डालें
12c से पहले
(1) ROWNUM क्लॉज का उपयोग करना
ROWNUM क्या है
यह एक छद्म स्तंभ है (वास्तविक स्तंभ नहीं) जो एक प्रश्न में उपलब्ध है। ROWNUM को नंबर 1, 2, 3, 4, ... N असाइन किया जाएगा, जहां N सेट में पंक्तियों की संख्या है ROWNUM के साथ प्रयोग किया जाता है। एक पंक्ति को एक ROWNUM मान स्थायी रूप से असाइन नहीं किया गया है।
शीर्ष 5 मान प्राप्त करने का तरीका यहां दिया गया है
SELECT * FROM (SELECT * FROM dept ORDER BY sales DESC) WHERE ROWNUM <= 5;
यह संस्करण बिक्री के आधार पर विभाग को क्रमबद्ध करेगा और फिर उसके सामने आने वाले पहले पांच रिकॉर्ड (शीर्ष-पांच रिकॉर्ड) लौटाएगा। इसके लिए जाएं।
SELECT a.* FROM (SELECT ROWNUM rn, b.* FROM ( SELECT * FROM dept ORDER BY sales dsc) b where rn <=10) a WHERE a.rn >= 5
सामान्य सिंटैक्स होगा
select * from ( select rownum rnum, a.* from (your_query) a where rownum <= M ) where rnum >= N;
(2) ROW_NUMBER() ऑरैकल एनालिटिक फ़ंक्शन का उपयोग करना:यह ROWNUM छद्म कॉलम के समान व्यवहार करता है लेकिन अधिक लचीला है और इसमें अधिक क्षमताएं हैं
शीर्ष 5 मान प्राप्त करने का तरीका यहां दिया गया है
SELECT * FROM (SELECT d.*,row_number() over (ORDER BY d.sales DSC) rn FROM dept d ) WHERE rn <= 5;
यहाँ पेजिनेशन के लिए क्वेरी है
SELECT * FROM ( SELECT d.*, row_number() over (ORDER BY d.sales DSC) rn FROM dept d) WHERE rn BETWEEN 0 AND 5 ORDER BY rn;
जब शीर्ष n प्रश्नों का उपयोग करते समय स्पॉट के लिए दो चीजें बंधी होती हैं, तो उपरोक्त शीर्ष N क्वेरी अलग-अलग रिकॉर्ड लौटाती हैं
(3) RANK() और DENSE_RANK() का उपयोग करना:ये विश्लेषणात्मक कार्य हैं जिनका उपयोग ऊपर बताई गई समस्या को दूर करने के लिए किया जा सकता है
यहां रैंक का उपयोग करके शीर्ष 5 मान प्राप्त करने का तरीका दिया गया है
SELECT * FROM (SELECT d.*,rank() over (ORDER BY d.sales DSC) rn FROM dept d ) WHERE rn <= 5;
यहां बताया गया है कि डेंस_रैंक का उपयोग करके शीर्ष 5 मान प्राप्त करने का तरीका क्या है
SELECT * FROM (SELECT d.*,dense_rank() over (ORDER BY d.sales DSC) rn FROM dept d ) WHERE rn <= 5;
12c के साथ
टॉप-एन फीचर :
Oracle डेटाबेस 12c में ANSI- मानक FETCH FIRST/NEXT और OFFSET क्लॉज के लिए समर्थन शामिल है - जिसे एक साथ रो लिमिटिंग क्लॉज कहा जाता है। यह क्लॉज आपको परिणाम सेट से पहले एन रिकॉर्ड्स को आसानी से प्राप्त करने में सक्षम बनाता है या वैकल्पिक रूप से, रिकॉर्ड्स के एक सेट को छोड़ने के बाद पहले एन रिकॉर्ड्स को आसानी से पुनर्प्राप्त करने में सक्षम बनाता है, ताकि आप परिणाम सेट के माध्यम से आसानी से पेजिनेट कर सकें
एक टॉप-एन क्वेरी हमें ऑर्डर किए गए सेट से ऊपर या नीचे एन पंक्तियों को पुनः प्राप्त करने की अनुमति देती है। दो टॉप-एन प्रश्नों के संयोजन से आपको एक ऑर्डर किए गए सेट के माध्यम से पेज करने की क्षमता मिलती है
उदाहरण:
SELECT value FROM mytable ORDER BY value DESC FETCH FIRST 10 ROWS ONLY; select * from my_test order by name fetch first 3 rows only;
यदि आप उपरोक्त क्वेरी के लिए अनुकूलक योजना को देखते हैं, तो यह अभी भी इसे करने के लिए पंक्ति_नंबर () का उपयोग कर रहा है
ऑफ़सेट सिंटैक्स का उपयोग करके इस सुविधा के साथ पेजिनेशन भी हो सकता है
- ऑफ़सेट 10 पंक्तियाँ केवल पहली 10 पंक्तियाँ लाती हैं
select * from my_test order by id offset 10 rows fetch next 10 rows only;
- ऑफ़सेट 10 पंक्तियाँ केवल पहली 0.1 प्रतिशत पंक्तियाँ प्राप्त करती हैं
select * from my_test order by id offset 10 rows first 0.1 percent rows only;
- ऑफ़सेट 10 पंक्तियाँ टाई के साथ पहली 3 पंक्तियाँ लाती हैं। इसका मतलब है कि टाई के साथ सभी शीर्ष पंक्तियों को भी परिणाम में शामिल किया जाएगा
select * from my_test order by name fetch first 3 rows with ties;
यदि आप उपरोक्त क्वेरी के अनुकूलक योजना की जांच करते हैं, तो आप पाएंगे कि अनुकूलक रैंक () फ़ंक्शन का उपयोग कर रहा है जैसा कि पूर्व 12c मामले में ऊपर दिखाया गया है
प्रतिबंध
(1) अगर आपके पास FOR UPDATE वाला SELECT स्टेटमेंट है, तो आप उसका इस्तेमाल नहीं कर सकते।
(2) SELECT स्टेटमेंट, सीक्वेंस को CURRVAL या NEXTVAL नहीं कर सकता
(3) अगर मटेरियलाइज्ड व्यू की क्वेरी में यह क्लॉज है, तो आप उस मटेरियलाइज्ड व्यू का इंक्रीमेंटल रिफ्रेश नहीं कर सकते हैं
आशा है कि आपको ऑरैकल में टॉप-एन क्वेरीज़ और ऑरैकल क्वेरी में पेजिनेशन पर लेख पसंद आया होगा। कृपया फ़ीडबैक दें
यह भी पढ़ता है
Oracle में लीड फ़ंक्शन
Oracle में रैंक फ़ंक्शन
https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljoffsetfetch.html