ROWNUM
इसमें अजीब बात है कि इसे क्वेरी में किसी शर्त के हिस्से के रूप में मूल्यांकन किया जा सकता है - लेकिन यदि पंक्ति उस फ़िल्टर को पास करने में विफल रहती है, तो ROWNUM
वह मान जो इसे सौंपा गया था, अगली पंक्ति के लिए फिर से उपयोग करने के लिए उपलब्ध हो जाता है।
इसका एक महत्वपूर्ण प्रभाव यह है कि यदि आप किसी ऐसी शर्त का उपयोग करते हैं जिसमें ROWNUM
. शामिल नहीं है 1 का मान, आपको कभी भी मैच नहीं मिलेगा। इस स्थिति के विरुद्ध परीक्षण की जाने वाली पहली पंक्ति पंक्ति 1 होगी; लेकिन फिर यह परीक्षण में विफल हो जाएगा, इसलिए अगली पंक्ति को तब पंक्ति 1 माना जाएगा; और इसी तरह।
तो आपकी हालत ROWNUM BETWEEN 2 AND 4
कभी भी सच नहीं हो सकता।
आपको जो समाधान मिला है वह पारंपरिक है। दूसरा यह होगा कि पंक्तियों को रैंक करने के लिए विश्लेषणात्मक फ़ंक्शन का उपयोग किया जाए, फिर रैंक पर फ़िल्टर किया जाए, जैसे:
SELECT MI.* FROM (
SELECT USER_ID,CUSTOMER_NAME, RANK() OVER (ORDER BY CREATION_DATE DESC) AS the_rank
FROM ELEC_AUTO_MERC
) MI
WHERE the_rank BETWEEN 2 AND 4;
इस उद्देश्य के लिए कई विश्लेषणात्मक कार्य - RANK, DENSE_RANK, और ROW_NUMBER - का उपयोग किया जा सकता है, और थोड़ा अलग परिणाम देगा, खासकर यदि संबंध हैं। डॉक्स देखें।