2011-09-20 20 views
29

Desidero effettuare l'ordinamento per proprietà TUTTI i dati nel mio db e SOLO DOPO che utilizzano LIMIT e OFFSET.SQL (ORACLE): ORDER BY e LIMIT

query come questa:

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

so che l'ordinamento si conclude non appena ha trovato le prime file ROW_COUNT del risultato ordinato. Posso ordinare tutti i dati prima di chiamare LIMIT e OFFSET?

+0

correlati: http://stackoverflow.com/q/470542/1461424 – Krumia

risposta

54

Prima di 12.1, Oracle non supporta le parole chiave LIMIT o OFFSET. Se si desidera recuperare le righe N attraverso M di un set di risultati, avresti bisogno di qualcosa come:

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>> 

o utilizzando funzioni analitiche:

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 

Uno di questi approcci vi guarirà darà righe N attraverso M del risultato ordinato.

Nel 12.1 e versioni successive, è possibile utilizzare le OFFSET e/o FETCH [FIRST | NEXT] operatori:

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

Forse non è così facile rispondere così com'è ha chiesto: quale di questi approcci è probabilmente migliore per le tabelle molto grandi (1-10 milioni di righe)? Forse si tratta di una selezione di 3 profondi vs 2 di profondità con rank()? In realtà, immagino che proverò entrambi e vedrò. –

+7

Per chi si sta chiedendo, ho scoperto che il primo approccio era più veloce per me a diversi ms, con il secondo approccio a diversi secondi. Non sono sicuro che sia la funzione stessa che aggiunge tempo o che impedisce qualsiasi ottimizzazione della query. Grazie per aver mostrato più approcci comunque! –