如何根据限制条件(例如从第5行到第50行,并按某一列排序)从Oracle 7版本中的表中提取行。
在Oracle 7版本中,无法使用LIMIT
或OFFSET
关键字来获取表中的行。如果想要检索结果集中第N到第M行的数据,需要使用以下方法之一:
方法一:
SELECT a.* FROM (SELECT b.*, rownum b_rownum FROM (SELECT c.* FROM some_table c ORDER BY some_column) b WHERE rownum <= <<上限>>) a WHERE b_rownum >= <<下限>>
方法二:使用分析函数
SELECT a.* FROM (SELECT b.*, rank() over (order by some_column) rnk FROM some_table) WHERE rnk BETWEEN <<下限>> AND <<上限>> ORDER BY some_column
无论使用哪种方法,都可以按照指定的范围获取排序后的结果集中的行。
从Oracle 12.1版本开始,可以使用OFFSET
和FETCH [FIRST | NEXT]
操作符来实现相同的功能:
SELECT * FROM some_table ORDER BY some_column OFFSET <<下限>> ROWS FETCH NEXT <<每页行数>> ROWS ONLY
也许这个问题的答案并不像问题本身那样简单:对于非常大的表(100万至1000万行),哪种方法更好?也许是3层嵌套的select语句好些,还是2层嵌套加rank()函数好些?实际上,我想试试两种方法,看看哪种更好。
对于那些想知道的人,我发现第一种方法对我来说更快,只需几毫秒,而第二种方法需要几秒钟。我不确定是函数本身增加了时间,还是它阻止了任何查询优化。不管怎样,感谢你展示了多种方法!