Oracle
 sql >> Database >  >> RDS >> Oracle

Mistero di rownum in oracolo

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.