Come posso prendere ad esempio in un database oracle le righe che vanno dalla 3 alla 15?
Limit 3,12 non va!
Aiuto!![]()
Come posso prendere ad esempio in un database oracle le righe che vanno dalla 3 alla 15?
Limit 3,12 non va!
Aiuto!![]()
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
--
Paolo Di Pierdomenico
blog: http://paolo.demiurgo.it
Demiurgo Electronic Music Project
http://www.demiurgo.it