ROWNUM
er mærkeligt, fordi det kan evalueres som en del af en betingelse i forespørgslen - men hvis rækken ikke passerer det filter, vil ROWNUM
værdien, som den blev tildelt, bliver tilgængelig til at blive brugt igen til næste række.
En vigtig effekt af dette er, at hvis du bruger en betingelse, der udelukker en ROWNUM
værdi på 1, vil du aldrig få et match. Den første række, der skal testes mod denne betingelse, vil være række 1; men så vil den fejle i testen, så næste række vil da blive betragtet som række 1; og så videre.
Så din tilstand ROWNUM BETWEEN 2 AND 4
kan aldrig være sandt.
Den løsning, du har fundet, er den traditionelle. En anden ville være at bruge en analytisk funktion til at rangere rækkerne og derefter filtrere på rangeringen, f.eks.:
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;
Adskillige analytiske funktioner - RANK, DENSE_RANK og ROW_NUMBER - kan bruges til dette formål og vil give lidt forskellige resultater, især hvis der er bindinger. Tjek dokumenterne.