Le prime N query e l'impaginazione sono comuni nelle applicazioni basate sul Web. L'utente immette una serie di criteri, che esegue una query e quindi consente all'utente di fare clic sui pulsanti Precedente e Successivo per scorrere il set di risultati. Per ottenere questa funzionalità di paging, l'applicazione deve essere in grado di ottenere un determinato insieme di righe dalla query del database.
Diamo un'occhiata al diverso metodo in Oracle per ottenere le prime N query in Oracle e alla paginazione nella query Oracle
Pre 12c
(1) Utilizzo della clausola ROWNUM
Cos'è ROWNUM
È una pseudocolonna (non una colonna reale) disponibile in una query. A ROWNUM verranno assegnati i numeri 1, 2, 3, 4, … N , dove N è il numero di righe nell'insieme con cui viene utilizzato ROWNUM. Un valore ROWNUM non è assegnato in modo permanente a una riga .
Ecco come ottenere i primi 5 valori
SELECT * FROM (SELECT * FROM dept ORDER BY sales DESC) WHERE ROWNUM <= 5;
Questa versione ordinerà il reparto in base alle vendite decrescenti e quindi restituirà i primi cinque record che incontra (i primi cinque record). vai per questo.
SELECT a.* FROM (SELECT ROWNUM rn, b.* FROM ( SELECT * FROM dept ORDER BY sales dsc) b where rn <=10) a WHERE a.rn >= 5
La sintassi generale sarebbe
select * from ( select rownum rnum, a.* from (your_query) a where rownum <= M ) where rnum >= N;
(2) Utilizzo della funzione di analisi Oracle ROW_NUMBER():si comporta in modo simile alla pseudo colonna ROWNUM ma è più flessibile e ha più capacità
Ecco come ottenere i primi 5 valori
SELECT * FROM (SELECT d.*,row_number() over (ORDER BY d.sales DSC) rn FROM dept d ) WHERE rn <= 5;
Ecco la query per l'impaginazione
SELECT * FROM ( SELECT d.*, row_number() over (ORDER BY d.sales DSC) rn FROM dept d) WHERE rn BETWEEN 0 AND 5 ORDER BY rn;
Le prime N query di cui sopra restituiranno record diversi quando due cose sono legate al posto quando si utilizzano le prime n query
(3) Utilizzo di RANK() e DENSE_RANK():queste sono funzioni analitiche che possono essere utilizzate per rimuovere il problema sopra indicato
Ecco il modo per ottenere i primi 5 valori utilizzando rank
SELECT * FROM (SELECT d.*,rank() over (ORDER BY d.sales DSC) rn FROM dept d ) WHERE rn <= 5;
Ecco il modo per ottenere i primi 5 valori usando dense_rank
SELECT * FROM (SELECT d.*,dense_rank() over (ORDER BY d.sales DSC) rn FROM dept d ) WHERE rn <= 5;
Con 12c
Funzione Top-N :
Oracle Database 12c include il supporto per le clausole FETCH FIRST/NEXT e OFFSET dello standard ANSI, chiamate insieme clausola di limitazione delle righe. Questa clausola ti consente di recuperare facilmente i primi N record da un set di risultati o, in alternativa, i primi N record dopo aver saltato un set di record, in modo da poter facilmente impaginare un set di risultati
Una query Top-N ci consente di recuperare le prime o le ultime N righe da un insieme ordinato. La combinazione di due query Top-N ti dà la possibilità di scorrere un insieme ordinato
Esempio:
SELECT value FROM mytable ORDER BY value DESC FETCH FIRST 10 ROWS ONLY; select * from my_test order by name fetch first 3 rows only;
Se guardi il piano di ottimizzazione per la query precedente, sta ancora usando row_number() nascosto per farlo
L'impaginazione può avvenire anche con questa funzione con la sintassi use offset
– offset 10 righe recupera solo le prime 10 righe
select * from my_test order by id offset 10 rows fetch next 10 rows only;
– l'offset di 10 righe recupera solo le prime righe dello 0,1%
select * from my_test order by id offset 10 rows first 0.1 percent rows only;
– sfalsare 10 righe recupera le prime 3 righe con le cravatte. Significa che anche tutte le prime righe con i pareggi verranno incluse nel risultato
select * from my_test order by name fetch first 3 rows with ties;
Se controlli il piano di ottimizzazione della query precedente, scoprirai che l'ottimizzatore sta utilizzando la funzione rank() come dimostrato sopra nel caso Pre 12c
Restrizione
(1)Se hai un'istruzione SELECT con FOR UPDATE, non puoi usarla.
(2)L'istruzione SELECT non può CURRVAL o NEXTVAL di sequenze
(3) Se la query delle viste materializzate ha questa clausola, quindi non puoi fare un aggiornamento incrementale di quella vista materializzata
Spero che ti piaccia l'articolo sulle prime N query in Oracle e Impaginazione in Oracle query. Si prega di fornire feedback
Legge anche
Funzione principale in Oracle
Funzione RANK in Oracle
https://docs.oracle.com/javadb/10.8.3.0/ref/rrefsqljoffsetfetch.html