如何根据限制条件(例如从第5行到第50行,并按某一列排序)从Oracle 7版本中的表中提取行。

12 浏览
0 Comments

如何根据限制条件(例如从第5行到第50行,并按某一列排序)从Oracle 7版本中的表中提取行。

我想在我的数据库中按属性对所有数据进行排序,然后再使用LIMIT和OFFSET。

查询语句如下:

SELECT select_list
    FROM table_expression
    [ ORDER BY ... ]
    [ LIMIT { number | ALL } ] [ OFFSET number ] 

我知道排序在找到排序后的前row_count行数据后就会结束。在调用LIMIT和OFFSET之前,我能否对所有数据进行排序?

0
0 Comments

在Oracle 7版本中,无法使用LIMITOFFSET关键字来获取表中的行。如果想要检索结果集中第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版本开始,可以使用OFFSETFETCH [FIRST | NEXT]操作符来实现相同的功能:

SELECT *
  FROM some_table
 ORDER BY some_column
 OFFSET <<下限>> ROWS
  FETCH NEXT <<每页行数>> ROWS ONLY

也许这个问题的答案并不像问题本身那样简单:对于非常大的表(100万至1000万行),哪种方法更好?也许是3层嵌套的select语句好些,还是2层嵌套加rank()函数好些?实际上,我想试试两种方法,看看哪种更好。

对于那些想知道的人,我发现第一种方法对我来说更快,只需几毫秒,而第二种方法需要几秒钟。我不确定是函数本身增加了时间,还是它阻止了任何查询优化。不管怎样,感谢你展示了多种方法!

0