因为前面那个的快,是建立在它的查询结果不是你要的分页的基础上,它是错的。它在内层只取了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;
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
建议楼主还是用ROW_NUMBER()OVER()
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
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;
(
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
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