2011-09-20 19 views
29

मैं संपत्ति द्वारा सॉर्ट करना चाहता हूं मेरे डीबी में सभी डेटा और केवल इसके बाद LIMIT और OFFSET का उपयोग करें।एसक्यूएल (ओरेकल): ऑर्डर बाय एंड लिमिट

क्वेरी इस तरह:

SELECT select_list 
    FROM table_expression 
    [ ORDER BY ... ] 
    [ LIMIT { number | ALL } ] [ OFFSET number ] 

मैं जानता हूँ कि छंटाई जैसे ही समाप्त होता है के रूप में यह क्रमबद्ध परिणाम की पहली ROW_COUNT पंक्तियों मिल गया है। क्या मैं LIMIT और ऑफ़सेट कॉल करने से पहले सभी डेटा सॉर्ट कर सकता हूं?

+0

संबंधित: http://stackoverflow.com/q/470542/1461424 – Krumia

उत्तर

54

12.1 से पहले, ओरेकल LIMIT या OFFSET कीवर्ड का समर्थन नहीं करता है।

SELECT a.* 
    FROM (SELECT b.*, 
       rownum b_rownum 
      FROM (SELECT c.* 
        FROM some_table c 
       ORDER BY some_column) b 
     WHERE rownum <= <<upper limit>>) a 
WHERE b_rownum >= <<lower limit>> 

या का उपयोग कर विश्लेषणात्मक कार्य::

SELECT a.* 
    FROM (SELECT b.*, 
       rank() over (order by some_column) rnk 
      FROM some_table) 
WHERE rnk BETWEEN <<lower limit>> AND <<upper limit>> 
ORDER BY some_column 

इनमें से किसी तरह आप दे देंगे पंक्तियों एन आप एक परिणाम सेट के एम के माध्यम से पंक्तियों को पुनः प्राप्त एन चाहते हैं, आप की तरह कुछ आवश्यकता होगी क्रमबद्ध परिणाम के एम के माध्यम से।

12.1 में और बाद में, आप उपयोग कर सकते OFFSET और/या FETCH [FIRST | NEXT] ऑपरेटरों:

SELECT * 
    FROM some_table 
ORDER BY some_column 
OFFSET <<lower limit>> ROWS 
    FETCH NEXT <<page size>> ROWS ONLY 
+2

शायद के रूप में आसानी उत्तर नहीं मिला यह है के रूप में पूछा: इनमें से कौन सा दृष्टिकोण बहुत बड़ी टेबल (1-10 मिलियन पंक्तियों) के लिए बेहतर है? हो सकता है कि यह रैंक() के साथ 3-गहरे चयन बनाम 2-गहरे के बारे में है? दरअसल, मुझे लगता है कि मैं बस कोशिश करूँगा और देखूँगा। –

+7

जो भी सोच रहा है, उसके लिए मैंने पाया कि कई सेकंड में दूसरे दृष्टिकोण के साथ पहला एमएस मेरे लिए पहला दृष्टिकोण तेज था। मुझे यकीन नहीं है कि यह फ़ंक्शन स्वयं है जो समय जोड़ता है, या यह किसी भी क्वेरी अनुकूलन को रोकता है। किसी भी तरह से कई दृष्टिकोण दिखाने के लिए धन्यवाद! –

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