ironMan 的个人博客 ironMan 的个人博客

记录精彩的程序人生

目录
分享一个Oracle中查询树结构语法:start with...connect by prior子句
/  

分享一个Oracle中查询树结构语法:start with...connect by prior子句

背景

免去繁琐编码,纯sql实现

项目上经常碰到组织架构、部门、人员等等分级管理的要求,常碰到如下需求:

  • 找到当前用户所在部门的顶层部门
  • 找到当前部门下所有子部门
  • 判断两个部门之间是否存在父子关系....等等

以往诸如此类的需求,一般都根据父子节点自行写树判断。而在Oracle中,提供了start with...connect by prior子句,可根据既定的父子节点关系直接返回树状集合,非常方便。

实现

例如:

select * from table  
start with org_id = 'xxx'  
connect by prior org_id = parent_id;

简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:
org_id,parent_id那么通过表示每一条记录的parent是谁,就可以形成一个树状结构。
用上述语法的查询可以取得这棵树的所有记录。
其中:

条件1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。
条件2 是连接条件,其中用PRIOR表示上一条记录,比如 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id,即本记录的父亲是上一条记录(等号左右的顺序影响是向上遍历还是向下遍历)。
条件3 是过滤条件,用于对返回的所有记录进行过滤。

其他

回归到需求上,该子句同时支持where及Order By 排序,可改变默认树排序及条件筛选,如获取顶级节点:

select *  from (select * from table a start with org_id= 'xxx'  connect by prior org_id = parent_id order by xxx (排序字段)desc)  where a.parent_id is null(顶级节点)

分享一个Oracle中查询树结构语法:start with...connect by prior子句


标题:分享一个Oracle中查询树结构语法:start with...connect by prior子句
作者:ironMan
地址:http://gxing.picp.vip/articles/2020/11/18/1605709384338.html