Oracle rownum zaczyna się od 1, więc nigdy nie otrzymasz pierwszego rzędu, jeśli powiesz between 2 and N
.
Potrzeba wiersza, aby "zainicjować" sekwencję pseudokolumny rownum, więc eliminując rownum 1 w swoich kryteriach, eliminujesz wszystkie rownums (lub każdy wiersz zasadniczo ma rownum 0
).
Spójrz na to w ten sposób. Nie otrzymasz ROWNUM, dopóki baza danych nie zwróci Ci wiersza. Pierwszy wiersz dowolnych kryteriów zawsze będzie miał wartość ROWNUM 1.
Teraz sztuczka, której możesz użyć, polega na użyciu podzapytania. Każde podzapytanie będzie miało swój własny numer wiersza, a jeśli skojarzysz je z inną nazwą kolumny, możesz zachować je w zapytaniach zewnętrznych i potraktować je w dowolny sposób. Więc jeśli chcesz zaimplementować stronicowanie zestawu wyników, zwykle aliasujesz rownum z wewnętrznych wyników jako rownum_ do zewnętrznego podzapytania, aby ograniczyć je za pomocą BETWEEN.
select * from
(select t.*, rownum as rownum_ from t)
where rownum_ between 2 and 6
Pamiętaj jednak, że zewnętrzny zestaw wyników będzie miał swój własny numer wiersza, więc możesz zrobić:
select t2.*, rownum from
(select a, b, rownum as rownum_ from t) t2
where rownum_ between 2 and 6
Zobaczysz rownum
na końcowym wyniku nadal zaczyna się od 1, ale Twój wewnętrzny wynik będzie miał rownum_
od 2.