Oracle 中 CONNECT BY PRIOR 递归算法
Oracle 中 START WITH ... CONNECT BY PRIOR 子句用法
CONNECT BY 是结构化查询中用到的,其基本语法是:
SELECT ... FROM tablename START WITH 条件 1 CONNECT BY 条件 2 WHERE 条件 3;
例:
SELECT * FROM table START WITH org_id = 'HBHqfWGWPy' CONNECT BY PRIOR org_id = parent_id;
简单说来是将一个树状结构存储在一张表里,比如一个表中存在两个字段:org_id, parent_id,那么通过表示每一条记录的父是谁,就可以形成一个树状结构。用上述语法的查询可以取得这棵树的所有记录。
其中:
- 条件 1 是根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树。
- 条件 2 是连接条件,其中用 PRIOR 表示上一条记录,比如
CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id是本条记录的parent_id,即本记录的父亲是上一条记录。 - 条件 3 是过滤条件,用于对返回的所有记录进行过滤。
简单介绍如下:
在扫描树结构表时,需要依此访问树结构的每个节点,一个节点只能访问一次,其访问的步骤如下:
- 从根节点开始;
- 访问该节点;
- 判断该节点有无未被访问的子节点,若有,则转向它最左侧的未被访问的子节,并执行第二步,否则执行第四步;
- 若该节点为根节点,则访问完毕,否则执行第五步;
- 返回到该节点的父节点,并执行第三步骤。
总之:扫描整个树结构的过程也即是中序遍历树的过程。
树结构的描述
树结构的数据存放在表中,数据之间的层次关系即父子关系,通过表中的列与列间的关系来描述。如 EMP 表中的 EMPNO 和 MGR。EMPNO 表示该雇员的编号,MGR 表示领导该雇员的人的编号,即子节点的 MGR 是父节点的 EMPNO。
在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为 1,根节点的子节点为 2,依此类推。

