oracle 层次查询
语法:
SELECT ... FROM
[WHERE condition]
--过滤某些节点
[
START WITH [nocycle] start_condition] --定义查询的起点, 可以使用子查询
CONNECT BY [[nocycle] PRIOR COLUMN1 = COLUMN2 [AND ...]]; --定义父子关系
order [ sibilings ] by ...
例1:
找出101雇员, 及其全下属/上司
select * from myemp start with employee_id = 101 connect by prior employee_id = manager_id; -- 找下属 -- connect by employee_id = prior manager_id; --找上司
prior在等号哪边,表示哪边是"我的"
找下属: "我的"employee_id = "别人的"manager_id --> 找出我的下属 (向下查询)
找上司: employee_id = prior manager_id 别人的工号 = 我的经理编号 --> 别人是我的经理 & 别人是我经理的经理 --> 我的上司们
注意,level伪列只能和connect by子句结合使用, 否则Oracle会返回错误 ORA-01788: 此查询块中要求 CONNECT BY 子句
例2:
统计树形的
层数
SELECT COUNT(DISTINCT LEVEL) FROM EMPLOYEES START WITH MANAGER_ID IS NULL CONNECT BY PRIOR EMPLOYEE_ID = MANAGER_ID;
例3:
统计树的
节点数量 , 例如, 查询每个级别的雇员数量
select count(level) --在统计树种节点的数量时, 一定不能加distinct! from employees start with manager_id is null connect by prior employee_id = manager_id group by level;
例4: