本帖最后由 zzx42 于 2009-12-23 12:45:17 编辑

解决方案 »

  1.   

    因为前面那个的快,是建立在它的查询结果不是你要的分页的基础上,它是错的。它在内层只取了20条数据进行排序,然后外层再过滤掉10条,你查的永远是前20条,不是全表数据。大数据量分页还是用row_number()分析函数吧,不过不知道hib支持不?参考语句:
    select t.series_id,
    t.series_name,
    t.author,
    t.publisher_id,
    t.descriptions
    from (
    select row_number() over(order by init_letter,series_name) rn,
    series_id,
    series_name,
    author,
    publisher_id,
    descriptions
    from dat_ct_series
    ) t
    where t.rn > in_page_size * (in_start_page-1)    --in_page_size 页面条数。in_start_page开始页数,从1开始。
    and t.rn <= in_page_size * in_start_page;
      

  2.   

    select * from  --返回了前20条记录中rownum为10-20的那10条
    (
    select rownum rownum_,a.* from --这个查询返回了前20条记录
    (
    select t.name,t.id --对于这一层select来说 两条语句返回的结果集是一样的
    from table_name t
    order by t.name
    )a 
    where rownum<=20

    where rownum_>=10;
     
    select * from   --这一层select选出了rownum为10-20的10条记录
    (select rownum rownum_,a.* --这一层并没有进行结果筛选 只是加上了rownum一列而已 而前面那个语句在这一层进行了筛选 因此效率应该高一些
    from 
    (
    select t.name,t.id --对于这一层select来说 两条语句返回的结果集是一样的
    from table_name t 
    order by t.name
    )a

    where rownum_<=20 and rownum_>=10
      

  3.   

    建议楼主还是用ROW_NUMBER()OVER()
      

  4.   


    select * from 
    (
        select  rownum as rn,  a.* from
        (        
            select t.name,t.id from table_name t order by t.name
        ) a 
        where rownum <= 10

    where rn >= 1
      

  5.   

    ROW_NUMBER()OVER() 这个也可以用做分页吗。 很少用这个呢。。