PDA

Visualizza la versione completa : [ORACLE] Selezionare un intervallo specifico di righe in una query


magnus
20-01-2005, 13:24
Come posso prendere ad esempio in un database oracle le righe che vanno dalla 3 alla 15?

Limit 3,12 non va!

Aiuto! :(

demiurgo
03-08-2007, 14:29
LIMIT e OFFSET non sono riconosciute da Oracle.

Per simulare una limit si può fare così:
SELECT * FROM table WHERE ROWNUM <= 10

Il che ritorna le prime 10 righe (poiché ROWNUM è 1-based)

Notiamo però che per simulare un OFFSET,LIMIT ci sono dei problemi: infatti
SELECT * FROM tabella WHERE ROWNUM BETWEEN 11 AND 20
non funziona

Possiamo però simulare una OFFSET,LIMIT scrivendo la query in questa forma
select * from (
select rownum as rn, tabella.* from tabella where rownum <= 20
) WHERE RN > 10

Va però detto che se usiamo una clausola ORDER BY, oracle effettua l'ordinamento DOPO aver limitato i valori, il che solitamente non è ciò che vogliamo. Quindi la seguente:
select * from (
select rownum as rn, tabella.* from tabella where rownum <= 20 order by campo
) WHERE RN > 10
non dà il risultato probabilmente atteso

Una soluzione a questo problema può essere ottenuta con il seguente workaround:
select * from (
select rownum as rn2, insel.* from (
select rownum as rn, tabella.* from tabella order by campo
) insel
) WHERE RN2 between 11 and 20

Quest'ultima query simula OFFSET, LIMIT in oracle e mantiene l'ordinamento voluto.
Il risultato è corretto, ma non so se ci sono metodi più efficienti per ottenere lo stesso.

Ciao
Demiurgo http://paolo.demiurgo.it

Loading