Oracle层次查询方式

create table cp(u int,uname int,parentid int);
 
测试数据:
select rownum+1,rownum,rownum from dual connect by rownum<=10000;
传统方式:
select * from (
      SELECT
      LEVEL as lvl,
      u,parentid
      FROM cp t1
        start with parentid IS NULL
      connect by parentid= prior u
      ) h where (0= 0 OR .lvl = 0);
Oracle11g新的方式:
WITH T(u,
uname,
parentid,
the_level,
path) AS
 ( ---- 必须把结构写出来
  SELECT u,
          uname,
          parentid ---- 先写锚点查询,用START WITH的条件
         ,
          1 AS the_level ---- 递归起点,第一层
         ,
          '\' || uname ---- 路径的第一截
    FROM cp
   WHERE parentid IS NULL ---- 原来的START WITH条件
  UNION ALL ---- 下面是递归部分
  SELECT e.u,
         e.uname,
         e.parentid ---- 要加入的新一层数据,来自要遍历的emp表
        ,
         1 + t.the_level ---- 递归层次,在原来的基础上加1
        ,
         t.path || '\' || e.uname ---- 把新的一截路径拼上去
    FROM t, cp e ---- 典型写法,把子查询本身和要遍历的表作一个连接
   WHERE t.u = e.parentid ---- 原来的CONNECT BY条件
  ) SEARCH DEPTH FIRST BY parentid SET seq --- 指定DEPTH深度优先 BREADTH广度优先, 按顺序生成序号seq
SELECT * FROM T
ORDER BY seq;


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值