rownum
is incremented as the result set is generated. If the value "1" is never generated, then "2" is never generated.
Because you want to return the row number, I would recommend using row_number()
:
select seqnum, user_id
from (select t1.*, row_number() over (order by ?) as seqnum
from table1 t1
) t1
where seqnum between 2 and 4;
The ?
is for the column that specifies the order of the result set.
SQL tables represent unordered sets. So your original query is functionally equivalent to:
select (1 + rownum), userid
from table1
where rownum <= 3;
Because the ordering is not specified. With a specified ordering, you can use row_number()
.
In Oracle 12C+, you can also express this as:
select rownum, userid
from table1
offset 1 row fetch first 3 rows only;