Oracle rownum从1开始,因此如果您说,您将永远不会得到第一个rownum between 2 and N
。
需要一行来“初始化” rownum伪列序列,因此,通过在您的条件中消除rownum 1,可以消除所有rownum(或每行本质上具有rownum 0
)。
这样看。在数据库向您返回一行之前,您不会得到ROWNUM。任何条件的第一行将始终为ROWNUM 1。
现在,您可以使用的技巧是使用子查询。每个子查询将具有其自己的rownum,如果将其别名为另一个列名,则可以将其保留在外部查询中,并根据需要对其进行处理。因此,如果要实现对结果集的分页,通常会将rownum从内部结果作为rownum_别名到外部子查询,以使用BETWEEN进行限制。
select * from
(select t.*, rownum as rownum_ from t)
where rownum_ between 2 and 6
但是请注意,外部结果集将具有其自己的rownum,因此您可以执行以下操作:
select t2.*, rownum from
(select a, b, rownum as rownum_ from t) t2
where rownum_ between 2 and 6
您会看到rownum
最终结果仍然从1开始,但是内部结果将从rownum_
2开始。