Oracle
 sql >> Base de données >  >> RDS >> Oracle

Mystère de rownum dans oracle

ROWNUM est bizarre en ce sens qu'il peut être évalué dans le cadre d'une condition dans la requête - mais si la ligne échoue ensuite à passer ce filtre, le ROWNUM la valeur qui lui a été attribuée devient disponible pour être réutilisée pour la ligne suivante.

Un effet important de ceci est que si vous utilisez une condition qui exclut un ROWNUM valeur de 1, vous n'obtiendrez jamais de correspondance. La première ligne à tester par rapport à cette condition sera la ligne 1 ; mais alors il échouera au test, donc la ligne suivante sera alors considérée comme la ligne 1 ; et ainsi de suite.

Donc votre condition ROWNUM BETWEEN 2 AND 4 ne peut jamais être vrai.

La solution de contournement que vous avez trouvée est la solution traditionnelle. Une autre consisterait à utiliser une fonction analytique pour classer les lignes, puis à filtrer sur le classement, par exemple :

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;

Plusieurs fonctions analytiques - RANK, DENSE_RANK et ROW_NUMBER - peuvent être utilisées à cette fin et produiront des résultats légèrement différents, surtout s'il y a des égalités. Consultez la documentation.