oracle树结构查询(start with connect by prior )

来源:互联网 发布:软件项目立项建议书 编辑:程序博客网 时间:2024/05/17 14:18


 层次化查询,即树型结构查询,是SQL中经常用到的功能之一,通常由根节点,父节点,子节点,叶节点组成,其语法如下:
       SELECT [LEVEL] ,column,expression,...
       FROM table_name
       [WHERE where_clause]
       [[START WITH start_condition] [CONNECT BY PRIOR prior_condition]];
      
       LEVEL:为伪列,用于表示树的层次
       start_condition:层次化查询的起始条件(empno = 7839)
       prior_condition:定义父节点和子节点之间的关系(empno = mgr标示父节点也就是当前节点的empno = 子节点的mgr)
eg:
 SQL> select empno,mgr,ename,job from emp start with empno = 7839 connect by prior empno = mgr;
树型结构遍历过程(通过上面的查询来描述)
       1).start with开始,查询符合条件的所有数据记录为根节点。如上例中empno = 7839 的所有数据为跟节点
       2).遍历根据当前节点,数据以connect by prior后面的数据进行判断,“=”左边的为当前节点的字段数据,右边的为所有字段数据。
       3).查询符合条件,则判断该节点含有子节点并转到2);未查询到则该节点不含子节点,调回到该节点的父节点,转到2)操作。
      整个遍历过程可以看做是一个递归调用。就想java的递归调用函数:
      void DG(int a){
int t = 节点数(..a..);
if(t==0){
return;
}
for(int i = 0; i < t; i++){
---
DG(x);
}
}
注意:相关异常 ORA-01436: CONNECT BY loop(环,圈) in user data 。也就是所拥护数据含有死循环数据。
table a;
eg: id   parentid
     1   2
     2   1
select * from a start with id = 1 connect by prior parentid= id; 这就是个死循环。
eg:id    parentid
   1     1
select * from a start with id = 1 connect by prior id = parentid; 这就是个死循环。




ORACLE递归
start with 要传入做为跟往下取的 ID
connect by prior 后面的内容为往下递归的条件
where 过滤条件放到start with 之前


select t.jgid_pk,t.sjjgid_fk,t.sjjgname
                  from xt_zzjg_jg t start with t.sjjgid_fk='001021'
connect by prior t.jgid_pk=t.sjjgid_fk;

0 0
原创粉丝点击