start with connect by prior 递归查询用法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了start with connect by prior 递归查询用法相关的知识,希望对你有一定的参考价值。

概述
层次化查询,即树型结构查询,是SQL中经常用到的功能之一,通常由根节点,父节点,子节点,叶节点组成,其语法如下:
SELECT [LEVEL] ,column,expression,...
FROM table_name
[WHERE where_clause]
[[START WITH start_condition] [CONNECT BY PRIOR prior_condition]];
LEVEL:伪列,用于表示树的层次
start_condition:层次化查询的起始条件,指定阶层的根。
prior_condition:定义父节点和子节点之间的关系,PRIOR指定父节点。作为运算符,PRIOR和加(+)减(-)运算的优先级相同。condition ... PRIOR expr = expr 或者 ... expr = PRIOR expr

例:
CONNECT BY last_name != ‘King‘ AND PRIOR employee_id = manager_id ...
CONNECT BY PRIOR employee_id = manager_id and PRIOR account_mgr_id = customer_id SYS_CONNECT_BY_PATH
SYS_CONNECT_BY_PATH这个函数是oracle9i才新提出来的!它一定要和connect by子句合用!第一个参数是形成树形式的字段,第二个参数是父级和其子级分隔显示用的分隔符!

注:概念引用至:http://czmmiao.iteye.com/blog/1824805

实例

今天在做ERP文件系统维护的过程中需要做一个文件审批权限管控,避免不同子公司的总经理批错文件,对原来的数据需要按照组织架构进行过滤,于是,就考虑到了遍历组织架构的方法,由于使用的数据库是Oracle,因此决定使用START WITH CONNECT BY PRIOR语法结构。

在理解完这个语法结构的基本原理之后,开始尝试书写符合实际应用的SQL语句,原理如下:

树型结构遍历过程
1).从根节点开始(即where_clause中的条件,如果为非根节点则分根节点作为根节点开始遍历)
2).遍历根节点
3).判断该节点是否存在子节点,如果有则访问最左侧未被访问的子节点,否则下一步。
4).当节点为叶节点,则访问完毕。
5).返回到该节点的父节点,直至检索完所有数据

(一)当前节点遍历子节点

select dp_code,max(sys_connect_by_path(dp_code,‘->‘)),level
from dp_mstr
where 1=1
--and dp_code = ‘商用结构部‘ 
--and level > 1
start with dp_code=‘商用科技公司‘ 
connect by  prior dp_code = dp_upper_dept
group by dp_code,level
order by level desc;

结果:

技术分享

(二)当前节点遍历根节点

select dp_code,max(sys_connect_by_path(dp_code,‘->‘)),level
from dp_mstr
where 1=1
--and dp_code = ‘商用结构部‘ 
--and level > 1
start with dp_code=‘商用科技公司‘ 
connect by  prior dp_upper_dept = dp_code
group by dp_code,level
order by level desc;

结果:

技术分享

总结:

若当前节点遍历子节点,则prior应该放在子节点一侧;

若当前节点遍历根节点,则prior应该放在上级节点一侧。

  

  

  

 












以上是关于start with connect by prior 递归查询用法的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE:start with ... connect by prior

start with ... connect by 递归查询

oracle 多级菜单查询 。start with connect by prior

oracle树形查询 start with connect by

start with connect by prior 递归查询用法

Oracle中start with...connect by子句的用法