Oracle高级查询之CONNECT BY

select a.*, level from dlsys.tcUnit a where nvl(validFlag,1) = 1
start with SeniorUnitId is null connect by SeniorUnitID = prior UnitID
order siblings by DisplayOrder

Oracle中的select语句能够用start with ... connect by prior ...子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是: sql

select ... from 
where <过滤条件,用于对返回的全部记录进行过滤>
start with <根结点的限定语句,固然能够放宽限定条件,以取得多个根结点,实际就是多棵树>
connect by [prior] <链接条件,其中用prior表示上一条记录,好比:connect by prior t.id = t.parent_id就是说上一条记录的id 是本条记录的parent_id,即本记录的父亲是上一条记录> 
下面咱们直接来看实例,查询'KING'的全部下属雇员。SQL语句以下:
[sql]  view plain copy
  1. select *  
  2.   from scott.emp e  
  3.  start with e.ename = 'KING'  
  4. connect by prior e.empno = e.mgr;  
咱们再来看另一个实例,反过来查询'SMITH'的全部上司。SQL语句以下:
[sql]  view plain copy
  1. select *  
  2.   from scott.emp e  
  3.  start with e.ename = 'SMITH'  
  4. connect by e.empno = prior e.mgr;  
经过上面的两个实例,估计你们应该理解的差很少了,接下来介绍connect by的几个固定搭档。

一、sys_connect_by_path函数
语法:sys_connect_by_path(列名, '分隔符')。
做用:从start with的地方开始遍历,将遍历到的路径根据函数中的分隔符,组成一个新的字符串。 函数

[sql]  view plain copy
  1. select sys_connect_by_path(ename, '/') ename_tree  
  2.   from scott.emp  
  3.  start with ename = 'KING'  
  4. connect by mgr = prior empno;  
插个题外话,介绍sys_connect_by_path函数使用的一个小技巧,把查询行转换成列,把表emp的全部列名以'|'分隔开输出(提示:你们能够把下面的语句拆开来逐个分析),SQL语句以下:
[sql]  view plain copy
  1. select max(ltrim(sys_connect_by_path(column_name, '|'), '|')) column_names  
  2.   from (select column_name, rownum rnum  
  3.           from user_tab_columns  
  4.          where table_name = 'EMP')  
  5.  start with rnum = 1  
  6. connect by rnum = rownum;  

二、level:在结构化查询结果中,每一行都是结构中的一个节点,level表示该节点在结构中的层次,根节点为1,根节点的子节点为2,以此类推。
下面SQL语句很直观的展现效果: spa

[sql]  view plain copy
  1. select ename, sys_connect_by_path(ename, '/') ename_tree, level  
  2.   from scott.emp  
  3.  start with ename = 'KING'  
  4. connect by mgr = prior empno;  

三、connect_by_root:用在列名以前,返回当前节点的根节点对应列的值。connect_by_isleaf:返回当前节点是否为叶子节点,“是”返回1,“否”返回0。
下面SQL语句很直观的展现效果: .net

[sql]  view plain copy
  1. select sys_connect_by_path(ename, '/') ename_tree,  
  2.        connect_by_root ename as root,  
  3.        connect_by_isleaf as isleaf  
  4.   from scott.emp e  
  5.  start with e.ename = 'KING'  
  6. connect by prior e.empno = e.mgr;  
相关文章
相关标签/搜索