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",共同学习,共同成长!!!