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.