ROWNUM
è strano in quanto può essere valutato come parte di una condizione nella query, ma se la riga non riesce a superare quel filtro, il ROWNUM
il valore che era stato assegnato diventa disponibile per essere riutilizzato per la riga successiva.
Un effetto importante di ciò è che se utilizzi qualsiasi condizione che escluda un ROWNUM
valore di 1, non otterrai mai una corrispondenza. La prima riga da testare rispetto a questa condizione sarà la riga 1; ma poi fallirà il test, quindi la riga successiva sarà considerata la riga 1; e così via.
Quindi la tua condizione ROWNUM BETWEEN 2 AND 4
non può mai essere vero.
La soluzione che hai trovato è quella tradizionale. Un altro sarebbe utilizzare una funzione analitica per classificare le righe, quindi filtrare in base alla classifica, ad esempio:
SELECT MI.* FROM (
SELECT USER_ID,CUSTOMER_NAME, RANK() OVER (ORDER BY CREATION_DATE DESC) AS the_rank
FROM ELEC_AUTO_MERC
) MI
WHERE the_rank BETWEEN 2 AND 4;
Diverse funzioni analitiche - RANK, DENSE_RANK e ROW_NUMBER - possono essere utilizzate a questo scopo e produrranno risultati leggermente diversi, specialmente se ci sono pareggi. Dai un'occhiata ai documenti.