Welcome 微信登录

首页 / 数据库 / MySQL / Oracle层次查询技巧

Oracle层次查询技巧create table emp_hire asselectempno,mgr,ename from empselect * from emp_hire
EMPNOMGRENAME
55557900ggg
73697902SMITH
74997698ALLEN
75217698WARD
75667839JONES
76547698MA & RTIN
76987839BLAKE
77827839CLARK
77887566SCOTT
7839KING
78447698TURNER
79007698JAMES
79027566FORD
79347782MILLER
78767788ADAMS
 这些数据存在着层次关系select    lpad("*",level,"*")||e.ename ename,    e.empno,    mgr fa_id,    (select ename from emp_hire where empno=e.mgr) fa_namefrom emp_hiree   START WITH MGR IS NULL   CONNECT BY PRIOR EMPNO = MGR 
ENAMEEMPNOFA_IDFA_NAME
*KING7839
**JONES75667839KING
***SCOTT77887566JONES
****ADAMS78767788SCOTT
***FORD79027566JONES
****SMITH73697902FORD
**BLAKE76987839KING
***ALLEN74997698BLAKE
***WARD75217698BLAKE
***MA & RTIN76547698BLAKE
***TURNER78447698BLAKE
***JAMES79007698BLAKE
****ggg55557900JAMES
**CLARK77827839KING
***MILLER79347782CLARK
   其中start with -- this identifies all LEVEL=1 nodes in the tree connect by -- describes how to walk from the parent nodes above to their children and their childrens children. 层次是一棵树, 又如同一个家族图谱 每一个子节电只有一个父节点;每一个分支,最末端是叶节点; SELECT ename  Employee, CONNECT_BY_ISLEAF  IsLeaf,LEVEL lev, SYS_CONNECT_BY_PATH(ename, "/")  PathFROM emp   START WITH MGR IS NULL   CONNECT BY PRIOR EMPNO = MGR 
EMPLOYEEISLEAFLEVPATH
KING01/KING
JONES02/KING/JONES
SCOTT03/KING/JONES/SCOTT
ADAMS14/KING/JONES/SCOTT/ADAMS
FORD03/KING/JONES/FORD
SMITH14/KING/JONES/FORD/SMITH
BLAKE02/KING/BLAKE
ALLEN13/KING/BLAKE/ALLEN
WARD13/KING/BLAKE/WARD
MA & RTIN13/KING/BLAKE/MA & RTIN
TURNER13/KING/BLAKE/TURNER
JAMES03/KING/BLAKE/JAMES
ggg14/KING/BLAKE/JAMES/ggg
CLARK02/KING/CLARK
MILLER13/KING/CLARK/MILLER
   检查一个层次是否存在闭循环CONNECT_BY_ISCYCLE 找出根节点CONNECT_BY_ROOT SELECT ename  Employee, CONNECT_BY_ISCYCLE,CONNECT_BY_ROOT ename FROM emp   START WITH MGR IS NULL   CONNECT BY NOCYCLE PRIOR EMPNO = MGR
EMPLOYEECONNECT_BY_ISCYCLECONNECT_BY_ROOTENAME
KING0KING
JONES0KING
SCOTT0KING
ADAMS0KING
FORD0KING
SMITH0KING
BLAKE0KING
ALLEN0KING
WARD0KING
MA & RTIN0KING
TURNER0KING
JAMES0KING
ggg0KING
CLARK0KING
MILLER0KING
  层次查询的过滤条件SELECT ename  Employee, CONNECT_BY_ISLEAF  IsLeaf,LEVEL lev, SYS_CONNECT_BY_PATH(ename, "/")  PathFROM empwhere level<3   START WITH MGR IS NULL   CONNECT BY PRIOR EMPNO = MGR Restriction on LEVEL in WHERE Clauses In a [NOT] IN condition in a WHERE clause, if the right-hand side of the condition is asubquery, you cannot use LEVEL on the left-hand sideof the condition. However, you can specify LEVEL in a subquery of the FROM clause to achieve the same result. For example, thefollowing statement is not valid: SELECT employee_id, last_name FROM employeesWHERE (employee_id,LEVEL)IN (SELECTemployee_id, 2 FROM employees)START WITHemployee_id = 2CONNECT BY PRIORemployee_id = manager_id;But the following statement is valid because it encapsulates the querycontaining theLEVEL information in the FROM clause: SELECT v.employee_id, v.last_name, v.levFROM(SELECT employee_id,last_name, LEVEL levFROM employees vSTART WITHemployee_id = 100CONNECT BY PRIORemployee_id = manager_id) vWHERE(v.employee_id, v.lev) IN(SELECT employee_id,2 FROM employees);   SIBLINGS的排序 SELECT ename  Employee, CONNECT_BY_ISLEAF  IsLeaf,LEVEL lev, SYS_CONNECT_BY_PATH(ename, "/")  PathFROM emp   START WITH MGR IS NULL   CONNECT BY PRIOR EMPNO = MGRORDER SIBLINGS BY ename desc
EMPLOYEEISLEAFLEVPATH
KING01/KING
JONES02/KING/JONES
SCOTT03/KING/JONES/SCOTT
ADAMS14/KING/JONES/SCOTT/ADAMS
FORD03/KING/JONES/FORD
SMITH14/KING/JONES/FORD/SMITH
CLARK02/KING/CLARK
MILLER13/KING/CLARK/MILLER
BLAKE02/KING/BLAKE
WARD13/KING/BLAKE/WARD
TURNER13/KING/BLAKE/TURNER
MA & RTIN13/KING/BLAKE/MA & RTIN
JAMES03/KING/BLAKE/JAMES
ggg14/KING/BLAKE/JAMES/ggg
ALLEN13/KING/BLAKE/ALLEN
 注意:ORDER SIBLINGS By一定与start with 与 connect by一起使用
  • 1
  • 2
  • 3
  • 下一页
Oracle解析流程详解Oracle数据块体系介绍相关资讯      Oracle基础教程 
  • Oracle块编程返回结果集详解  (11/10/2013 10:45:58)
  • Oracle基础教程之设置系统全局区  (08/22/2013 14:24:00)
  • Oracle基础教程知识点总结  (06/18/2013 07:43:32)
  • Oracle基础教程之tkprof程序详解  (10/22/2013 11:49:50)
  • Oracle基础教程之sqlplus汉字乱码  (07/18/2013 16:30:00)
  • Oracle 管理之 Linux 网络基础  (02/16/2013 18:37:35)
本文评论 查看全部评论 (0)
表情: 姓名: 字数