首页 > 代码库 > start with connect by prior 递归查询用法

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 递归查询用法