ITPub博客

首页 > 数据库 > Oracle > Oracle connect by

Oracle connect by

原创 Oracle 作者:chenoracle 时间:2015-07-06 09:56:09 0 删除 编辑

oracle中 connect by prior 递归算法 

1
CONNECT BY子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIORY运算符必须放置在连接关系的两列中某一个的前面。对于节点间的父子关系,PRIOR运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。在连接关系中,除了可以使用列名外,还允许使用列表达式。START WITH 子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。 
2
prior运算符必须放置在连接关系的两列中某一个的前面。prior运算符在一侧表示父节点,在另一侧表示子节点,从而确定查找树结构是的顺序是自顶向下还是自底向上。
PRIOR被置于CONNECT BY子句中等号的前面时,则强制从根节点到叶节点的顺序检索,即由父节点向子节点方向通过树结构,我们称之为自顶向下的方式。如: 
CONNECT BY PRIOR EMPNO=MGR 
PIROR运算符被置于CONNECT BY 子句中等号的后面时,则强制从叶节点到根节点的顺序检索,即由子节点向父节点方向通过树结构,我们称之为自底向上的方式。例如: 
CONNECT BY EMPNO=PRIOR MGR 
在这种方式中也应指定一个开始的节点。 
3
start with子句为可选项,用来标识哪个节点作为查找树型结构的根节点。若该子句被省略,则表示所有满足查询条件的行作为根节点。START WITH: 不但可以指定一个根节点,还可以指定多个根节点。
4
使用LEVEL,在具有树结构的表中,每一行数据都是树结构中的一个节点,由于节点所处的层次位置不同,所以每行记录都可以有一个层号。层号根据节点与根节点的距离确定。不论从哪个节点开始,该起始根节点的层号始终为1,根节点的子节点为2, 依此类推。 


Syntax 1 CONNECT BY [NOCYCLE]  START WITH  
Syntax 2 START WITH  CONNECT BY [NOCYCLE]  


SQL> select level,empno,ename,mgr from emp start with empno=7566 connect by prior empno=mgr;
     LEVEL      EMPNO ENAME             MGR
---------- ---------- ---------- ----------
         1       7566 JONES            7839
         2       7788 SCOTT            7566
         3       7876 ADAMS            7788
         2       7902 FORD             7566
         3       7369 SMITH            7902


SQL> select level,empno,ename,mgr from emp start with empno=7566 connect by prior mgr=empno;
     LEVEL      EMPNO ENAME             MGR
---------- ---------- ---------- ----------
         1       7566 JONES            7839
         2       7839 KING


 
通过connect by构造数据
SQL> select level,rownum,rowid from dual connect by rownum<=5;
     LEVEL     ROWNUM ROWID
---------- ---------- ------------------
         1          1 AAAAB0AABAAAAOhAAA
         2          2 AAAAB0AABAAAAOhAAA
         3          3 AAAAB0AABAAAAOhAAA
         4          4 AAAAB0AABAAAAOhAAA
         5          5 AAAAB0AABAAAAOhAAA


SQL> select level,rownum,rowid from dual connect by level<=5;
     LEVEL     ROWNUM ROWID
---------- ---------- ------------------
         1          1 AAAAB0AABAAAAOhAAA
         2          2 AAAAB0AABAAAAOhAAA
         3          3 AAAAB0AABAAAAOhAAA
         4          4 AAAAB0AABAAAAOhAAA
         5          5 AAAAB0AABAAAAOhAAA
例如:


SQL> create table test as select level as id,level*10000 as sal from dual connect by level<=5;
表已创建。


SQL> select * from test;
        ID        SAL
---------- ----------
         1      10000
         2      20000
         3      30000
         4      40000
         5      50000
欢迎关注我的微信公众号"IT小Chen",共同学习,共同成长!!!




 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29785807/viewspace-1724106/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
Oracle ACE、OCMU 用户组成员、Oracle 11g OCM、微信公众号"IT小Chen"

注册时间:2014-08-05

  • 博文量
    853
  • 访问量
    2727959