接着上一章节的内容,咱们来分析下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

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



