oracle 中 connect by prior 实现递归查询,基本语法如下:
SELECT * FROM tablename where <condition1> connect by prior <condition2> start with <condition3>
以 Oracle 中表: employees 为例演示过程:
employees 中和树形结构有关的字段为 employee_id, manager_id。
截图表中部分数据并用树形结构表示出来:
说明:分支节点为manager,同时也是employee; 叶子节点不是 manager,仅为employee。
执行下面的 sql:
SELECT LEVEL, e.employee_id, e.manager_id FROM employees e WHERE 1 = 1 CONNECT BY PRIOR e.employee_id = e.manager_id START WITH e.employee_id = 101;
结果如下:
下面对代码加以分析:
-- 从 employee_id = 101开始,查询 manager_id 为 101 的节点,有:108 -- 以 employee_id = 108 为父节点, 查询 manager_id = 108 的节点,有:109,110,111,112,113 -- 101 -> 108 -> 109 ... 递归结束后,继续找 101 的其他子节点,有:200,203,204,205
1.以 prior 所在等式的一侧为父节点
CONNECT BY PRIOR e.employee_id = e.manager_id --即以 employee为父节点
2.start with 是递归查询的起始点
START WITH e.employee_id = 101 -- 从 employee_id = 101 这个节点开始查询
3. where 条件会对查询的所有结果进行筛选