一个非常好的ORACLE的分页SQL语句
select * from (select my_table.*, rownum as my_rownum from ( select yhbh, yhmc from yysf_tb_yonghxx order by yhbh) my_table where rownum <20 ) where my_rownum>=10
------------------------------------
其它几种分页实现:
1.根据ROWID来分
select * from t_xiaoxi where rowid in(select rid from (select rownum rn,rid from(select rowid rid,cid from
t_xiaoxi order by cid desc) where rownum<10000) where rn>9980) order by cid desc;
执行时间0.03秒
2.按分析函数来分
select * from (select t.*,row_number() over(order by cid desc) rk from t_xiaoxi t) where rk<10000 and rk>9980;
执行时间1.01秒
3.按ROWNUM来分
select * from(select t.*,rownum rn from(select * from t_xiaoxi order by cid desc) t where rownum<10000) where
rn>9980;执行时间0.1秒
其中t_xiaoxi为表名称,cid为表的关键字段,取按CID降序排序后的第9981-9999条记录,t_xiaoxi表有70000多条记录
个人感觉1的效率最好,3次之,2最差
oracle如何返回指定行数之间的查询结果
如何返回指定行数之间的查询结果,以实现web记录分页,在Oracle中有许多的方法,这里仅仅列出了4种,希望能对大家有所帮助,大家可以根据不同需要选择下面的script
1)select ... where rownum < 50 minus select ... where rownum < 30
这个方法因为用到了minus操作符,所以速度会受影响。
2)
SELECT results.* FROM
( SELECT t2.*, rownum rownumber FROM
( SELECT t.* FROM mv_table t WHERE ORDER BY col1) t2) results
WHERE results.rownumber BETWEEN 30 and 50 ORDER BY col1
这个方法是从一个论坛上看到的,没有亲自测试过
3)
定义cursor x, 2.fetch x a,b,c; loop ...... end loop;
其中用两个循环变量和一个FLAG变量,分别表示,当前的记录数,属于第几页的, 及第一页面。
ps;
j:=to_number(kafyf);
i:=1;
open cx;
loop fetch cx into col1,col2,col3,col4,col5,col6;
if cx%NOTFOUND then exit; end if;
if i>=j then
htp.tableRowOpen;
htp.tableData(col1);
htp.tableData(col2);
htp.tableData(col4);
htp.tableData(col5);
htp.tableData(col6);
htp.tableData(col3);
htp.tableRowClose;
i:=i+1;
if i=j+10 then l:=1; exit; end if;
else i:=i+1;
end if;
end loop;
close x;
该方法是名叫‘淼’的网友写的script,他用到了Oracle web2kit中的OWA_UTIL package。
4)How can one page forward and backwards through a table?
Externalize ROWNUM by implementing queries like this:
SELECT ...
FROM (SELECT ROWNUM rnum, ... FROM ...)
WHERE rnum BETWEEN :low AND :high AND rownum <(:high :low + 1);