Oracle Sql优化之分层查询(connect by)

数据库   发布日期:2025年05月17日   浏览次数:153

1.对于表中行与行存在父子关系时,可以通过connect by查询方式,查询行与行之间的父子关系

  1. select lpad('-',(level-),'-')|| empno as tempno,
  2. ename,mgr,level,
  3. decode(level,,) as root,
  4. decode(connect_by_isleaf,,) as leafnode
  5. from emp
  6. start with empno=
  7. connect by (prior empno) = mgr
  8. order by level;

除了level伪列外,connect_by_isleaf也是伪列,1表示没有子记录,0则相反

2.当需要把表中某一属性按照父子关系拼接起来,可以借助sys_connect_by_path

  1. with x1 as
  2. (select deptno,ename,row_number() over(partition by deptno order by ename) as rn from emp1)
  3. select deptno,sys_connect_by_path(ename,',') as nameC from x1
  4. where connect_by_isleaf =
  5. start with rn= connect by (prior deptno)= deptno and (prior rn)=rn-;

3.对于树形查询结果排序,如果保持树结构的正确性非常关键,因此我们采用SIBLINGS关键字只对分支内部进行排序

  1. select lpad('-',(level-),'-')|| empno as tempno,
  2. ename,mgr,level,
  3. decode(level,,) as root,
  4. decode(connect_by_isleaf,,) as leafnode
  5. from emp1
  6. start with empno=
  7. connect by (prior empno) = mgr
  8. order siblings by empno desc ;

对于非父子关系字段的过滤条件,需要为该字段的过滤条件做一个子查询,然后基于该子查询再进行树形查询。

4.上面几个查询都是从根往子节点查询,如何从子节点递归查询到根呢,如下所示

  1. select ename,mgr,level
  2. from emp1
  3. start with empno=
  4. connect by (prior mgr) = empno
  5. order by level;

以上就是Oracle Sql优化之分层查询(connect by)的详细内容,更多关于Oracle Sql优化之分层查询(connect by)的资料请关注九品源码其它相关文章!