oracle中 connect by prior
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,依此类推。
节点和分支的裁剪
在对树结构进行查询时,可以去掉表中的某些行,也可以剪掉树中的一个分支,使用 WHERE
子句来限定树型结构中的单个节点。但这却不影响其后代节点(自顶向下检索时)或前辈节点(自底向上检索时)。
排序显示
象在其它查询中一样,在树结构查询中也可以使用 ORDER BY
子句,改变查询结果的显示顺序,而不必按照遍历树结构的顺序。