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) 部门名称
通过子节点向根节点追朔
Ql代码 select * from personsdept start with deptid= connect by prior paredeptid=deptid<SPAN >select * from personsdept start with deptid= connect by prior paredeptid=deptid</SPAN>
select * from personsdept start with deptid= connect by prior paredeptid=deptid
通过根节点遍历子节点
Ql代码 select * from personsdept start with paredeptid= connect by prior deptid=paredeptid
<SPAN >select * from personsdept start with paredeptid= connect by prior deptid=paredeptid</SPAN>
select * from personsdept start with paredeptid= connect by prior deptid=paredeptid
可通过level 关键字查询所在层次
Ql代码 select a*level from personsdept a start with paredeptid= connect by prior deptid=paredeptid
<SPAN >select a*level from personsdept a start with paredeptid= connect by prior deptid=paredeptid</SPAN>
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即本记录的父亲是上一条记录
条件 是过滤条件用于对返回的所有记录进行过滤
简单介绍如下
在扫描树结构表时需要依此访问树结构的每个节点一个节点只能访问一次其访问的步骤如下
第一步从根节点开始
第二步访问该节点
第三步判断该节点有无未被访问的子节点若有则转向它最左侧的未被访问的子节点并执行第二步否则执行第四步
第四步若该节点为根节点则访问完毕否则执行第五步
第五步返回到该节点的父节点并执行第三步骤
总之扫描整个树结构的过程也即是中序遍历树的过程
. 树结构的描述
树结构的数据存放在表中数据之间的层次关系即父子关系通过表中的列与列间的关系来描述如 EMP 表中的 EMPNO 和 MGR EMPNO 表示该雇员的编号 MGR 表示领导该雇员的人的编号即子节点的 MGR 值等于父节点的 EMPNO 值在表的每一行中都有一个表示父节点的 MGR (除根节点外)通过每个节点的父节点就可以确定整个树结构
在 SELECT 命令中使用 CONNECT BY 和 START WITH 子句可以查询表中的树型结构关系其命令格式如下
SELECT
CONNECT BY {PRIOR 列名 = 列名 | 列名 =PRIOR 裂名 }
[START WITH]
其中 CONNECT BY 子句说明每行数据将是按层次顺序检索并规定将表中的数据连入树型结构的关系中 PRIORY 运算符必须放置在连接关系的两列中某一个的前面对于节点间的父子关系 PRIOR 运算符在一侧表示父节点在另一侧表示子节点从而确定查找树结构是的顺序是自顶向下还是自底向上在连接关系中除了可以使用列名外还允许使用列表达式 START WITH 子句为可选项用来标识哪个节点作为查找树型结构的根节点若该子句被省略则表示所有满足查询条件的行作为根节点
START WITH 不但可以指定一个根节点还可以指定多个根节点
. 关于 PRIOR
运算符 PRIOR 被放置于等号前后的位置决定着查询时的检索顺序
PRIOR 被置于 CONNECT BY 子句中等号的前面时则强制从根节点到叶节点的顺序检索即由父节点向子节点方向通过树结构我们称之为自顶向下 的方式如
CONNECT BY PRIOR EMPNO=MGR
PIROR 运算符被置于 CONNECT BY 子句中等号的后面时则强制从叶节点到根节点的顺序检索即由子节点向父节点方向通过树结构我们称之为自底向上 的方式例如
CONNECT BY EMPNO=PRIOR MGR
在这种方式中也应指定一个开始的节点
. 定义查找起始节点
在自顶向下查询树结构时不但可以从根节点开始还可以定义任何节点为起始节点以此开始向下查找这样查找的结果就是以该节点为开始的结构树的一枝
.使用 LEVEL
在具有树结构的表中每一行数据都是树结构中的一个节点由于节点所处的层次位置不同所以每行记录都可以有一个层号层号根据节点与根节点的距离确定不论从哪个节点开始该起始根节点的层号始终为 根节点的子节点为 依此类推
.节点和分支的裁剪
在对树结构进行查询时可以去掉表中的某些行也可以剪掉树中的一个分支使用 WHERE 子句来限定树型结构中的单个节点以去掉树中的单个节点但它却不影响其后代节点(自顶向下检索时)或前辈节点(自底向顶检索时)
.排序显示
象在其它查询中一样在树结构查询中也可以使用 ORDER BY 子句改变查询结果的显示顺序而不必按照遍历树结构的顺序