2010-12-29 10 views
24

Come posso restituire un intervallo specifico di valori ROWNUM?SQL ROWNUM come restituire righe tra un intervallo specifico

sto cercando il seguente:

select * from maps006 where rownum >49 and rownum <101 

Questo restituisce solo le righe che corrispondono l'operatore <.

+1

Sede [? ** Come ROWNUM lavora in una query di impaginazione **] (http://stackoverflow.com/questions/30321483/how-rownum-works-in-pagination-query/30321788#30321788) –

risposta

48
SELECT * from 
(
select m.*, rownum r 
from maps006 m 
) 
where r > 49 and r < 101 
+0

Solo per ragioni di completezza, c'è un modo per rimuovere la colonna r dopo? –

+3

La mia soluzione rapida è di cambiare la prima linea in: 'SELECT col1, col2, col3 from' dove col1, col2 ecc sarebbe il nome di tutte le colonne eccetto r –

+2

questo non funziona su oracle se non si ' t dare a ROWNUM un alias –

2
SELECT * FROM 
(SELECT ROW_NUMBER() OVER(ORDER BY Id) AS RowNum, * FROM maps006) AS DerivedTable 
WHERE RowNum BETWEEN 49 AND 101 
23
SELECT * 
FROM (
     SELECT q.*, rownum rn 
     FROM (
       SELECT * 
       FROM maps006 
       ORDER BY 
         id 
       ) q 
     ) 
WHERE rn BETWEEN 50 AND 100 

Nota la vista doppia nidificato. ROWNUM viene valutato prima dello ORDER BY, quindi è necessario per la numerazione corretta.

Se si omette la clausola ORDER BY, non si ottiene un ordine coerente.

+0

punto notato! Stavo facendo questo errore con l'ordine di! – MozenRath

+0

Ottengo "ORA-00904:" RN ": identificatore non valido" quando provo qualcosa di simile. –

+0

@RobinGreen: fai un'altra domanda e pubblica "qualcosa di simile" lì. – Quassnoi

2

È inoltre possibile utilizzare CTE con clausola.

WITH maps AS (Select ROW_NUMBER() OVER (ORDER BY Id) AS rownum,* 
from maps006) 

SELECT rownum, * FROM maps WHERE rownum >49 and rownum <101 
2
select * 
from emp 
where rownum <= &upperlimit 
minus 
select * 
from emp 
where rownum <= &lower limit ; 
4

ero alla ricerca di una soluzione per questo e ho trovato questo grande article explaining the solution estratto Rilevante

My all-time-favorito l'uso di ROWNUM è impaginazione. In questo caso, utilizzo ROWNUM per ottenere le righe da N a M di un set di risultati. La forma generale è come seguente:

select * enter code here 
    from (select /*+ FIRST_ROWS(n) */ 
    a.*, ROWNUM rnum 
     from (your_query_goes_here, 
     with order by) a 
     where ROWNUM <= 
     :MAX_ROW_TO_FETCH) 
where rnum >= :MIN_ROW_TO_FETCH; 

Ora, con un esempio reale (ottiene righe 148, 149 e 150):

select * 
    from 
    (select a.*, rownum rnum 
    from 
    (select id, data 
    from t 
    order by id, rowid) a 
    where rownum <= 150 
) 
    where rnum >= 148; 
+0

Questo funziona davvero! –

10

So che questa è una vecchia questione, tuttavia, è utile menzionare le nuove funzioni nell'ultima versione .

Da Oracle 12c in poi, è possibile utilizzare il nuovo Top-n Row funzione limitante. Non c'è bisogno di scrivere una subquery, nessuna dipendenza da ROWNUM.

Ad esempio, la query di seguito sarebbe tornato dipendenti tra 4 ° più alto al 7 stipendi più alti in ordine crescente:

SQL> SELECT empno, sal 
    2 FROM emp 
    3 ORDER BY sal 
    4 OFFSET 4 ROWS FETCH NEXT 4 ROWS ONLY; 

    EMPNO  SAL 
---------- ---------- 
     7654  1250 
     7934  1300 
     7844  1500 
     7499  1600 

SQL> 
Problemi correlati