ROWNUM: estrazione lotto di righe

Supponiamo di avere un insieme di righe da voler estrarre in lotti, ad esempio lotti da 10, senza utilizzare una particolare condizione su una colonna.

Di seguito la lista da estrarre:

select EMPLOYEE_ID , FIRST_NAME, LAST_NAME from EMPLOYEES
where EMPLOYEE_ID between 100 and 125;


La funzione ROWNUM viene eseguita dopo la clausola ORDER BY
Oracle esegue prima  l'ordinamento sull'intera lista e poi estrae il sottoinsieme di righe indicato, ossia non estrae prima il sottoinsieme di righe e poi lo ordina.
Se la clausola non è presente, il risultato della query è di default ordinato secondo la prima colonna.

select EMPLOYEE_ID , FIRST_NAME, LAST_NAME from EMPLOYEES
where EMPLOYEE_ID between 100 and 125
and ROWNUM < 11;


select EMPLOYEE_ID , FIRST_NAME, LAST_NAME from EMPLOYEES
where EMPLOYEE_ID between 100 and 125
and ROWNUM < 11
ORDER BY 1 desc;


Se vogliamo estrarre i seguenti lotti 100-109, 110-119, 120-125  utilizzare la seguente query:

select EMPLOYEE_ID , FIRST_NAME, LAST_NAME , RIGA 
from 
    (select EMPLOYEE_ID , FIRST_NAME, LAST_NAME , ROWNUM as riga 
     from (
            select EMPLOYEE_ID , FIRST_NAME, LAST_NAME 
            from EMPLOYEES
            where EMPLOYEE_ID between 100 and 125
            order by 1 asc
          ))
where RIGA between :da and :a;

Ogni volta che si esegue la query appare un prompt in cui inserire i valori da e a.


1° lotto: inserendo i valori da = 1 e a = 10 otteniamo la seguente estrazione:



2° lotto: inserendo i valori da = 11 e a = 21 otteniamo la seguente estrazione:



3° lotto: inserendo i valori da = 22 e a = 32 otteniamo la seguente estrazione:


Nell'esempio proposto, considerando le poche righe da estrarre, avremmo potuto imporre semplicemente un vincolo sulla colonna employee_id; la suddetta query si applica con successo se abbiamo colonne non numeriche o comunque che non hanno una sequenza di valori e\o un numero elevato di righe,
  
Query da utilizzare per estrarre lotti di righe in un determinato ordine 

select a , b, c , riga 
from 
    (select a , b, c , ROWNUM as riga 
     from (
               select a , b, c 
               from nome_tabella
               order by a
          ))
where riga BETWEEN  : da
                             AND :  a;




Post popolari in questo blog

Create e Drop Pluggable Database

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione