Come posso limitare il numero di righe restituite da una query Oracle dopo l'ordine?
C'è un modo per far sì che una query Oracle
si comporti come se contenesse una clausola MySQL limit
?
In MySQL
, posso fare questo:
select *
from sometable
order by name
limit 20,10
per ottenere le righe dalla 21esima alla 30esima (saltare le prime 20, dare le successive 10). Le righe sono selezionate dopo il order by
, quindi inizia davvero dal 20° nome in ordine alfabetico.
In Oracle
, l'unica cosa che la gente menziona è la pseudo-colonna rownum
, ma viene valutata prima di order by
, il che significa questo:
select *
from sometable
where rownum <= 10
order by name
restituirà un insieme casuale di dieci righe ordinate per nome, che di solito non è quello che voglio. Inoltre non permette di specificare un offset.
963
3
Puoi usare una subquery per questo come
Una soluzione analitica con una sola query annidata:
Rank()
potrebbe essere sostituito daRow_Number()
ma potrebbe restituire più record di quanto ci si aspetta se ci sono valori duplicati per il nome.(non testato) qualcosa come questo potrebbe fare il lavoro
C'è anche la funzione analitica rank, che potete usare per ordinare per.