在 oracle 中限制记录时如何避免 rownum 作为列?

How can i avoid rownum as a column when limiting records in oracle?

当我 运行 查询时:

select * 
  from ( select a.*, 
                ROWNUM rnum 
           from ( select * 
                    from test 
                   order by null ) a  
          where ROWNUM <= 2000 )
  where rnum  >=1

我将所有列连同 rownum 作为我不想要的单独列,如何实现这个或有什么方法可以限制记录?

由于最终过滤器是针对 ROWNUM >= 1(这将始终为真),您可以消除它并只使用:

select * 
from   (
  select * 
  from   test 
  order by null
)  
where ROWNUM <= 2000

(注意:ORDER BY NULL 将应用非确定性排序。)

如果您想指定不同的起始行,则需要指定您想要的列 return:

select col_1,
       col_2,
       -- ...
       col_n
from   (
  select a.*,
         ROWNUM rnum
  from   (
    select * 
    from   test 
    order by null
  ) a
  where ROWNUM <= 2000
)
WHERE rnum > 1000

在 Oracle 12c 中您可以使用:

SELECT *
FROM   test
ORDER BY NULL
FETCH FIRST 2000 ROWS ONLY;

SELECT *
FROM   test
ORDER BY NULL
OFFSET 1000 ROWS FETCH NEXT 1000 ROWS ONLY;