ROWNUM
jest dziwne, ponieważ może zostać ocenione jako część warunku w zapytaniu - ale jeśli wiersz nie przejdzie następnie tego filtra, ROWNUM
przypisana wartość staje się dostępna do ponownego użycia w następnym wierszu.
Jednym z ważnych efektów tego jest to, że jeśli użyjesz dowolnego warunku, który wyklucza ROWNUM
wartość 1, nigdy nie dostaniesz dopasowania. Pierwszym wierszem, który zostanie przetestowany pod kątem tego warunku, będzie wiersz 1; ale wtedy nie przejdzie testu, więc następny wiersz zostanie uznany za wiersz 1; i tak dalej.
Więc twój stan ROWNUM BETWEEN 2 AND 4
nigdy nie może być prawdą.
Znalezione obejście jest tradycyjne. Innym byłoby użycie funkcji analitycznej do uszeregowania wierszy, a następnie filtrowanie według rangi, np.:
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;
W tym celu można użyć kilku funkcji analitycznych — RANK, DENSE_RANK i ROW_NUMBER — i dadzą one nieco inne wyniki, zwłaszcza w przypadku remisów. Zapoznaj się z dokumentacją.