看到一些教材的分页方法无法使用ORDER BY,请问最简洁最高效的分页方式是什么?

解决方案 »

  1.   

    无法使用order by ?? 是无limit吧?, 用rownum 代替
      

  2.   

    select   *   from   (select   rownum   id,tab.*   from   tab   order   by   datecol)
      where   id   >   10   and   id   <   20;
    我现在采取了这种方法,但是担心效率不行,select   rownum   id,tab.*   from   tab   order   by   datecol这个是不是把整个表全部给查询一遍?
      

  3.   

    难道不是:
    select * from tab 
    where rownum>10 and rownum<20
    order by datecoldatecol上建索引即可
      

  4.   

    mmm, rownum 用 〉 似乎不行试试这个select * from tab 
    where rownum<20 order by datecol
    minus
    select * from tab 
    where rownum<=10 order by datecol
      

  5.   

    记得ASP分页的时候就是查询全部记录然后设置游标分页的(记录集分页方式),不管了,我就这么写吧。
    select   *   from   (select   rownum   id,tab.*   from   tab   order   by   datecol)
      where   id   >   10   and   id   <   20;
    另外:
    select * from tab 
    where rownum>10 and rownum<20
    order by datecol
    似乎太简单了,不知道能不能用,一会儿测试一下。
      

  6.   

    给一个实现oracle分页查询的函数
    示例表如下:
    create table test(
    id varchar2(50),
    name varchar2(50)
    );
    函数定义:
    function sql_getlimitquery(string $query,string $fields, int $from,int $count)
    返回:一个sql语句,实现查询从$from 到$from+$count的记录
    参数解释:
    $query:一个基础sql查询语句,例如:select * from test;
    $fields:表示你要求返回的哪些字段列,例如:"id,name";
    $from:查询从第几条记录开始,例如:0,必须为大于等于0的数
    $count:每页显示的记录数,必须大于1,例如:10函数实现:
    function sql_getlimitquery($query="",$fields, $from, $count)
        {
            $query = "SELECT $fields    FROM".
                     "  (SELECT rownum as linenum, $fields  FROM".
                     "      ($query)".
                     '  WHERE rownum <= '. ($from + $count) .
                     ') WHERE linenum >= ' . ++$from;
                     global $debug;
                     if($debug)echo $query;
            return $query;
        }最终返回一个实现分页查询的sql语句.