2011-08-16 9 views
5

का उपयोग कर रहा नेट पर ओरेकल पेजिंग क्वेरी की खोज, और उनमें से ज्यादातर ने मुझे बताया क्वेरी दो बार रैप करने के लिए:अंतर जब ROWNUM

SELECT *, ROWNUM rn 
    FROM tableName t 
WHERE ROWNUN BETWEEN 100 AND 200 
:

SELECT * 
    FROM (SELECT t.*, ROWNUM rn 
      FROM tableName t 
     WHERE ROWNUM < 200) 
WHERE rn > 100 

बस अगर मैं के रूप में यह टाइप कर सकते हैं सोच

ऐसा लगता है कि दूसरा काम भी करता है। क्या इन दो क्वेरी के बीच कोई (प्रदर्शन) अंतर है?

+1

मुझे लगता है कि आपको संभवत: आपको आवश्यक उत्तर मिल गया है, लेकिन मुझे लगता है कि ओरेकल के लिए नए लोग अक्सर पेजिंग प्रश्नों के साथ संघर्ष करते हैं, खासकर जब से MySQL इसे LIMIT कुंजी शब्द के साथ इतना आसान बनाता है। मैं कहूंगा कि यह ओरेकल शुरुआती लोगों की सबसे आम बातों में से एक है, इसलिए मैंने हाल ही में इसके बारे में एक लेख लिखा - http://betteratoracle.com/posts/18-limiting-query-results-top-n-and- खिड़की-प्रश्न –

उत्तर

4

समस्या यह है कि आप उसी क्वेरी में फ़िल्टर कर रहे हैं कि ROWNUM उत्पन्न हो रहा है। इसलिए आपके पास एक सबक्वायरी होना चाहिए जो पहले राउनम उत्पन्न करता है और फिर फ़िल्टरिंग लागू करता है। बीटवेन ठीक काम क्यों करता है शायद इंजन कुछ प्रक्रियाओं को कैसे संसाधित करता है, लेकिन मैं सावधान रहूंगा कि यह आपको लगातार सही परिणाम नहीं दे सकता है। तो यह प्रदर्शन की बात नहीं है क्योंकि यह वास्तव में सही परिणाम प्राप्त करने का मामला है।

यह लेख बताता है कि क्यों आप सबक्वेरी के बाहर से अधिक डाल करने के लिए है:। http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/pseudocolumns009.htm

SELECT * FROM employees 
    WHERE ROWNUM > 1; 

"पहली पंक्ति लाए जाने के 1 के एक ROWNUM असाइन किया गया है और हालत झूठी बनाता है दूसरी पंक्ति होने के लिए प्राप्त किया गया अब पहली पंक्ति है और इसे 1 का ROWNUM भी सौंपा गया है और स्थिति को गलत बना दिया गया है। बाद में सभी पंक्तियां इस शर्त को पूरा करने में असफल होती हैं, इसलिए कोई पंक्तियां वापस नहीं आती हैं। "

4

ROWNUM उपयोग करने के लिए उचित तरीका है:

SELECT x.* 
    FROM (SELECT t.*, 
       ROWNUM rn 
      FROM tableName t) AS x 
WHERE x.rn > 100 
    AND x.rn < 200 

BETWEEN समावेशी है, इसलिए दो प्रश्नों समान तर्क नहीं हैं।

ROWNUM पर अधिक जानकारी के लिए, this link (includes link to Oracle documentation देखें।

+0

आपके उत्तर के लिए धन्यवाद। मेरी मुख्य चिंता यह है कि मेरे प्रश्नों में उन दो प्रश्नों के बीच कोई प्रदर्शन अंतर है। क्या आप निम्न लिंक पर एक नज़र डाल सकते हैं: http://stackoverflow.com/questions/241622/paging-with-oracle यह क्वेरी को दो बार लपेटता है। – GaryX

+0

@ गैरीएक्स: जैसा कि मैंने कहा, प्रदान किए गए प्रश्न समान नहीं हैं; दूसरी क्वेरी टेबल में सबकुछ वापस कर देगी। निष्पादन एक चिंता है जब तक आपको वैध डेटा प्राप्त न हो जाए। –

+0

@ ओएमजी टट्टू, क्या आप कहने का मतलब रखते थे, "निष्पादन _not_ एक चिंता है जब तक आप वैध डेटा प्राप्त नहीं करते"? –

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