oracle中的select语句可以用START WITHCONNECT BY PRIOR子句实现递归查询connect by 是结构化查询中用到的其基本语法是
select * from tablename start with cond
connect by cond
where cond;
简单说来是将一个树状结构存储在一张表里比如一个表中存在两个字段:
idparentid那么通过表示每一条记录的parent是谁就可以形成一个树状结构
用上述语法的查询可以取得这棵树的所有记录
其中COND是根结点的限定语句当然可以放宽限定条件以取得多个根结点实际就是多棵树
COND是连接条件其中用PRIOR表示上一条记录比如 CONNECT BY PRIOR ID=PRAENTID就是说上一条记录的ID是本条记录的PRAENTID即本记录的父亲是上一条记录
COND是过滤条件用于对返回的所有记录进行过滤
对于oracle进行简单树查询(递归查询)
DEPTID NUMBER 部门id
PAREDEPTID NUMBER 父部门id(所属部门id)
NAME CHAR ( Byte) 部门名称
通过子节点向根节点追朔
select * from personsdept start with deptid= connect by prior paredeptid=deptid
通过根节点遍历子节点
select * from personsdept start with paredeptid= connect by prior deptid=paredeptid
可通过level 关键字查询所在层次
select a*level from personsdept a start with paredeptid= connect by prior deptid=paredeptid
PSstart with 后面所跟的就是就是递归的种子也就是递归开始的地方
connect by prior后面的字段顺序是有讲究的
若prior缺省则只能查询到符合条件的起始行并不进行递归查询
例
select * from table
start with org_id = HBHqfWGWPy
connect by prior org_id = parent_id;
简单说来是将一个树状结构存储在一张表里比如一个表中存在两个字段:
org_idparent_id那么通过表示每一条记录的parent是谁就可以形成一个树状结构
用上述语法的查询可以取得这棵树的所有记录
其中
条件 是根结点的限定语句当然可以放宽限定条件以取得多个根结点实际就是多棵树
条件 是连接条件其中用PRIOR表示上一条记录
比如 CONNECT BY PRIOR org_id = parent_id就是说上一条记录的org_id 是本条记录的parent_id即本记录的父亲是上一条记录
条件 是过滤条件用于对返回的所有记录进行过滤
简单介绍如下
在扫描树结构表时需要依此访问树结构的每个节点一个节点只能访问一次其访问的步骤如下
第一步从根节点开始
第二步访问该节点
第三步判断该节点有无未被访问的子节点若有则转向它最左侧的未被访问的子节点并执行第二步否则执行第四步
第四步若该节点为根节点则访问完毕否则执行第五步
第五步返回到该节点的父节点并执行第三步骤
总之扫描整个树结构的过程也即是中序遍历树的过程