免去繁琐编码,纯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子句