基本语法结构
sql
SELECT ...
FROM table
START WITH condition -- 起始条件
CONNECT BY [PRIOR] condition -- 连接条件
关键概念:PRIOR 的位置决定方向
PRIOR 放在哪一边,哪一边就是父节点。
- 由上到下查询(父→子)
场景:从根节点开始,查询所有子孙节点
sql
-- 从指定根节点开始,向下查询所有子节点
SELECT *
FROM ORGAN O
START WITH O.ORG_ID = '根节点ID' -- 起始点:根节点
CONNECT BY PRIOR O.ORG_ID = O.P_ORG_ID -- PRIOR在左边,左边是父节点
执行逻辑:
先找到 ORG_ID = '根节点ID' 的记录
然后找 P_ORG_ID = 当前记录的ORG_ID 的记录(子节点)
递归继续找子节点的子节点...
示例:
aql
-- 查询总公司下的所有部门
SELECT ORG_ID, ORG_NAME, P_ORG_ID, LEVEL
FROM ORGAN
START WITH ORG_NAME = '总公司' -- 从总公司开始
CONNECT BY PRIOR ORG_ID = P_ORG_ID -- 向下找子节点
ORDER BY LEVEL;
- 由下到上查询(子→父)
场景:从某个节点开始,查询所有祖先节点
sql
-- 从指定节点开始,向上查询所有父节点
SELECT *
FROM ORGAN O
START WITH O.ORG_ID = '子节点ID' -- 起始点:子节点
CONNECT BY PRIOR O.P_ORG_ID = O.ORG_ID -- PRIOR在左边,左边是父节点
执行逻辑:
先找到 ORG_ID = '子节点ID' 的记录
然后找 ORG_ID = 当前记录的P_ORG_ID 的记录(父节点)
递归继续找父节点的父节点...
示例:
sql
-- 查询某个部门的所有上级机构
SELECT ORG_ID, ORG_NAME, P_ORG_ID, LEVEL
FROM ORGAN
START WITH ORG_ID = '部门A的ID' -- 从部门A开始
CONNECT BY PRIOR P_ORG_ID = ORG_ID -- 向上找父节点
ORDER BY LEVEL DESC;