ROWNUM
е странен, тъй като може да бъде оценен като част от условие в заявката - но ако след това редът не успее да премине този филтър, ROWNUM
стойността, която му е присвоена, става достъпна за използване отново за следващия ред.
Един важен ефект от това е, че ако използвате условие, което изключва ROWNUM
стойност 1, никога няма да получите съвпадение. Първият ред, който ще бъде тестван спрямо това условие, ще бъде ред 1; но след това ще се провали на теста, така че следващият ред ще се счита за ред 1; и така нататък.
Така че вашето условие ROWNUM BETWEEN 2 AND 4
никога не може да бъде истина.
Заобиколното решение, което сте намерили, е традиционното. Друго би било да използвате аналитична функция за класиране на редовете, след което да филтрирате по ранга, напр.:
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;
Няколко аналитични функции - RANK, DENSE_RANK и ROW_NUMBER - могат да се използват за тази цел и ще дадат малко по-различни резултати, особено ако има равенства. Вижте документите.