在oracle生成树时,prior起了至关重要的作用,它决定了书的遍历方向。下面用例子分别阐述之:
1、prior放在子节点方向
scott@ORA9I> l
1 SELECT substr(sys_connect_by_path(ENAME,'->'),3) EMPLOYEE
2 FROM EMP
3 CONNECT BY PRIOR EMPNO=MGR
4* START WITH ENAME='JONES'
scott@ORA9I> /
EMPLOYEE
------------------------------------------------------------
JONES
JONES->SCOTT
JONES->SCOTT->ADAMS
JONES->FORD
JONES->FORD->SMITH
--从上面可以看出,如果prior放在子节点方向,则oracle会根据start with指定的节点作为根节点,从上往下遍历基于指定节点的所有分支。它可能会对应多个分支。
--如果不指定start with,则oracle会把所有的节点都当成根节点分别往下遍历。
--用以下方法查看以JONES为根节点的所有完整的分支
scott@ORA9I> l
1 SELECT substr(sys_connect_by_path(ENAME,'->'),3) EMPLOYEE
2 FROM EMP
3 WHERE EMPNO NOT IN (SELECT MGR FROM EMP WHERE MGR IS NOT NULL)
4 CONNECT BY PRIOR EMPNO=MGR
5* START WITH ENAME='JONES'
scott@ORA9I> /
EMPLOYEE
------------------------------------------------------------
JONES->SCOTT->ADAMS
JONES->FORD->SMITH
2、prior放在父节点方向
scott@ORA9I> l
1 SELECT substr(sys_connect_by_path(ENAME,'->'),3) EMPLOYEE
2 FROM EMP
3 CONNECT BY PRIOR MGR=EMPNO
4* START WITH ENAME='JONES'
scott@ORA9I> /
EMPLOYEE
------------------------------------------------------------
JONES
JONES->KING
--从以上结果可以看出,当prior放在父节点端时,oracle会根据start with执行的节点作为子节点,从下往上找其对应的父节点,然后再根据找到的父节点找父节点的父节点,依此类推,直到找到根节点为止。
--我们也不难知道,这种情况下只可能有一个分支。
--用以下方法查看以JONES为最低层子节点的完整的分支
scott@ORA9I> l
1 SELECT substr(sys_connect_by_path(ENAME,'->'),3) EMPLOYEE
2 FROM EMP
3 WHERE MGR IS NULL
4 CONNECT BY PRIOR MGR=EMPNO
5* START WITH ENAME='JONES'
scott@ORA9I> /
EMPLOYEE
------------------------------------------------------------
JONES->KING
总结:
1)prior放在子节点端,则表示扫描树是以start with指定的节点作为根节点从上往下扫描。可能对应一个或多个分支。
start with可以省略,如果省略,表示对所有节点都当成根节点分别进行遍历
2)prior放在父节点端,则表示扫描树是以start with指定的节点作为最低层子节点,从下往上扫描。顺序是子节点往父节点扫描,直到根节点为止,这种情况只能得到一个分支。
start with可以省略,如果省略,表示对所有节点都当成最低层子节点分别往根节点方向遍历
一个不错的应用例子:http://blog.csdn.net/wqsmiling/archive/2005/06/14/394404.aspx
分享到:
相关推荐
oracle中的数查询,介绍的详细,有例子。
不知道你用过这个东东没有,以前也是没使用过这个prior,感觉oracle的知识太少,所以根据我学习的经验总结给大家看它的作用以及他是怎么使用的,你可以自己比较一下自己遍历树的方法和这种方法的区别。
。。。
。。。
一、基本语法 connect by递归查询基本语法是: select 1 from 表格 start with … connect by...prior:prior关键字可以放在等号的前面,也可以放在等号的后面,表示的意义是不一样的,比如 prior id = pid,就表示p
Oracle_start_with_connect_by_prior_用法[文].pdf
oracle中 connect by prior 递归算法 Oracle中start with...connect by prior子句用法 connect by 是结构化查询中用到的
NULL 博文链接:https://yunqiang-zhang-hotmail-com.iteye.com/blog/1312354
本文介绍Oracle中使用START WITH...CONNECT BY PRIOR子句实现递归查询树形结构的方法,小伙伴们可以参考一下。
其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...
Oracle 递归查询, start with connect by prior 用法 find_in_set 函数 concat,concat_ws,group_concat 函数 MySQL 自定义函数 手动实现 MySQL 递归查询 Oracle 递归查询 在 Oracle 中是通过 start ...
§15.4 在 PL/SQL 中使用 sqlcode,sqlerrm 273 第十六章 存储过程和函数 276 §16.1 引言 276 §16.2 存储过程 276 §16.2.1 创建过程 276 §16.2.2 使用过程 278 §16.2.3 开发存储过程步骤 279 §16.2.3.1 编辑...
20.oracle8中扩充了group by rollup和cube的操作。有时候省了你好多功夫的。 下面的语句可以进行总计 select region_code,count(*) from aicbs.acc_woff_notify group by rollup(region_code); <2> 对第1个字段...
对于数据库中的树形结构数据,如部门表,有时候,我们需要知道某部门的所有下属部分或者某部分的所有上级部门,这时候就需要用到mysql的递归查询 最近在做项目迁移,Oracle版本的迁到Mysql版本,遇到有些oracle的...
需求是表里的某个字段存储的值是以逗号分隔开来的,要求根据分隔的每一个值都能查出来数据,但是不能使用like查询。 数据是这样的: 查询的sql如下: select * from ( select guid, regexp_substr(st_responsible...
1 性能优化 1.1 避免频繁 commit,尤其...说明:除非是单据的单号,要求必须是唯一,并且依据流水号不可以跳号,不然在大量交易的表格中,不在乎跳耗时,要取得唯一的Primary Key 建议使用Oracle Sequence这样速度会较...
绝对经典的资料,所有语法用法都能查到 版权所有 (c) 1996 SAP AG 公司。保留 所有权利。 未经 SAP AG公司明 确许可,本 功能描述的 任何部分都 不得以任何 形式或以任 何目的进行 复制或传播 。若此处内 容变动,恕...
1 SQL基础 1.1 基本概念 结构化查询语言(Structured Query ...select后面出现的列,如果没有使用集合函数,必须出现在group by 中。 select sno,sname,sum(grade) from student group by sno,sname; //合法写法 select...
jar包:项目中除了使用了struts2,hibernate3.0和spring1.8以外(用spring2.0的包也可以.不能低于1.8的包.)还是用了junit,ajax,第三方的table组件.等等.所以需要下载相对应的包. 为了上传jar.我专门申请了一个网盘.所有...