没有高并发,亿万级数据优化的sql脚本四

        接着上一章节的内容,咱们来分析下oracle新的树形查询语句语法。sql如下:

        --没处理递归无限循环情况
        with resc_tree (resc_id, parent_resc_id, lvl) as (
               select resc_id, parent_resc_id, 1
               from mytable3
               where resc_id = '1001'  -- 根节点,查找确定起始记录行(也是锚成员)  (1)
               union all
               select e.resc_id, e.parent_resc_id,  rt.lvl + 1
               from mytable3 e   -- 递归查询(结合下面的join语句关联查找递归记录)
               join resc_tree rt on e.parent_resc_id = rt.resc_id
         )
         select * from resc_tree;      

        上面语句(1)句相当于 start with 子句。join 相当于 connect by 关键词。join 的表名必须是语句最开始 with 后的别名。join resc_tree rt  该表的别名rt在on子句后面确定优先关系,相当于prior的作用。本例中join..on 子句后面rt.谁就相当于以谁作为起始行字段的值开始递归查找。查找的方向就是根据on子句后的关联关系,上面例句就是根据起始行的resc_id的值去查找表mytable3中记录parent_resc_id 的值,只要他们相等就把对应记录作为结果集返回。

        如果需要处理递归循环的情况,只需要在join子句后面加上个where 条件就可以了。本例中可以加如下where 子句:

        where instr(rt.path, e.resc_id) = 0 

        上面的例句查询结果等价于下面的sql,读者可以好好对比一下:

        select  r.id, r.resc_id, r.parent_resc_id, level from mytable3 r   start with r.resc_id = '1001' connect by nocycle  r.parent_resc_id = prior r.resc_id order by level;

        接着再来看看db2的树形递归查询语句吧!

        注意,在db2的树形查询中是没有START WITH ... CONNECT BY PRIOR... 这样的语法的,但是可以这样书写:

        with resc_tree(resc_id, parent_resc_id, lvl) as (
             select resc_id, parent_resc_id, 1
             from mytable3
           &nbs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangzewu1

谢谢您的鼓励,一分钱都是爱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值