oracle递归查询和分页查询

================以下引自 http://www.cnblogs.com/hxw/archive/2005/09/11/234619.html=================================
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最差
===============引用结束=================================
其中第3种方法之所以慢,是select * 引起的,最内层循环必须要select * 才能保证取得所有的列,外层循环的select *都依赖于它,因此没有办法优化,第一种写法和第三种很像,只是在分页的时候只select rid,只是在最后select的时候才取所有字段,效率比较高。 如果最外层用连接而不是in,效率应该还可以提高点。

==================递归查询===============================
一个部门结构,id表示员工号,parentId为上司工号,name为姓名(见图片)。 现在要求根据一个员工的姓名(唯一)来查询他的最高上司信息(最高上司没有parentId),因此可以用
select m.*
from
(select t.id, t.parentid,t.name from xfyq_1.t_recurse t
start with t.name = '王三'
connect by prior t.parentid = t.id) m
where m.parentid is null

其中start with ... connect by prior 是递归查询, prior的一端表示上一条记录,上面语句表示把“王三”这个根结点, prior t.parentId = t.id 表示取id为上一条记录的parentId,这里的上一条记录就是当前的“王三”这条记录,依次类推。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值