Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Mistério de rownum no oráculo


ROWNUM é estranho porque pode ser avaliado como parte de uma condição na consulta - mas se a linha não passar por esse filtro, o ROWNUM valor que foi atribuído fica disponível para ser usado novamente na próxima linha.

Um efeito importante disso é que se você usar qualquer condição que exclua um ROWNUM valor de 1, você nunca obterá uma correspondência. A primeira linha a ser testada contra essa condição será a linha 1; mas então ele falhará no teste, então a próxima linha será considerada a linha 1; e assim por diante.

Portanto, sua condição ROWNUM BETWEEN 2 AND 4 nunca pode ser verdade.

A solução alternativa que você encontrou é a tradicional. Outra seria usar uma função analítica para classificar as linhas e filtrar a classificação, por exemplo:
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;

Várias funções analíticas - RANK, DENSE_RANK e ROW_NUMBER - podem ser usadas para essa finalidade e produzirão resultados ligeiramente diferentes, especialmente se houver empates. Confira os documentos.