ORACLE树查询

来源:网络 责任编辑:栏目编辑 发表时间:2013-07-02 01:30 点击:

昨天CSDN里处理问题的时候,发现了一个语法connect_by_root,眼前一亮,好像没有见过,经常用的只是connect by ,于是翻开文档重新学习了下

先看自带的SCHEMA的SCOTT的数据:
SQL>SELECT e.empno,e.ename,e.mgr,e.deptno  FROM emp e;

EMPNO ENAME     MGR DEPTNO
7369 SMITH 7902 20
7499 ALLEN 7698 30
7521 WARD 7698 30
7566 JONES 7839 20
7654 MARTIN 7698 30
7698 BLAKE 7839 30
7782 CLARK 7839 10
7788 SCOTT 7566 20
7839 KING  10
7844 TURNER 7698 30
7876 ADAMS 7788 20
7900 JAMES 7698 30
7902 FORD 7566 20
7934 MILLER 7782 10
 

阶层查询温习

■PRIOR
阶层查询的CONNECY BY condition的条件式需要用到PRIOR来指定父节点,
作为运算符,PRIOR和加(+)减(-)运算的优先级相同。 这个很重要,重点理解下:

prior empno= mgr

意思是:祖先(上一层记录)的empno等于本条记录的mgr,即:通过根节点遍历子节点

 

■阶层查询
语法:START WITH condition CONNECT BY NOCYCLE condition

START WITH 指定阶层的根
CONNECT BY 指定阶层的父/子关系
NOCYCLE 存在CONNECT BY LOOP的纪录时,也返回查询结果。
condition ... PRIOR expr = expr 或者 ... expr = PRIOR expr

 

■CONNECT BY子句的例子
通过CONNECT BY子句定义职员和上司的关系。

 

■LEVEL的例子
通过LEVEL虚拟列表示节点的关系。

 

从上级往下级够造树查询(默认排序):

这个公司的老大是KING,

7839 KING  10
因为他没有上级,按照EMPNO和MGR排下层级关系:

SQL>SELECT E.EMPNO, E.ENAME, E.MGR, E.DEPTNO, LEVEL
  FROM EMP E
 START WITH E.EMPNO = 7839
CONNECT BY PRIOR E.EMPNO = E.MGR;

EMPNO ENAME   MGR   DEPTNO   LEVEL
7839 KING  10 1
7566 JONES 7839 20 2
7788 SCOTT 7566 20 3
7876 ADAMS 7788 20 4
7902 FORD 7566 20 3
7369 SMITH 7902 20 4
7698 BLAKE 7839 30 2
7499 ALLEN 7698 30 3
7521 WARD 7698 30 3
7654 MARTIN 7698 30 3
7844 TURNER 7698 30 3
7900 JAMES 7698 30 3
7782 CLARK 7839 10 2
7934 MILLER 7782 10 3
可以很清晰的看到层级关系,同时也可以看到结果按照DEPTNO和LEVEL的排序,看到部门的组成层级关系,如果我这样得到组织机构了,我还想按人名排序呢,因为默认的排序是按照EMPNO来进行的,此时:

 

■START WITH子句的排序
通过START WITH指定根节点,ORDER SIBLINGS BY保持阶层的顺序。

 

从上级往下级够造树查询(按组织的人名排序):

SQL>SELECT E.EMPNO, E.ENAME, E.MGR, E.DEPTNO, LEVEL
  FROM EMP E
 START WITH E.EMPNO = 7839
CONNECT BY PRIOR E.EMPNO = E.MGR
 ORDER SIBLINGS BY E.ENAME;

EMPNO ENAME   MGR   DEPTNO   LEVEL
7839 KING  10 1
7698 BLAKE 7839 30 2
7499 ALLEN 7698 30 3
7900 JAMES 7698 30 3
7654 MARTIN 7698 30 3
7844 TURNER 7698 30 3
7521 WARD 7698 30 3
7782 CLARK 7839 10 2
7934 MILLER 7782 10 3
7566 JONES 7839 20 2
7902 FORD 7566 20 3
7369 SMITH 7902 20 4
7788 SCOTT 7566 20 3
7876 ADAMS 7788 20&nbs

    相关新闻>>

      发表评论
      请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
      用户名: 验证码:点击我更换图片
      最新评论 更多>>

      推荐热点

      • Table函数使用简介
      • Oracle数据库Constraint约束的常用操作及异常处理
      • Bulk Collect性能分析(zz)
      • export/import的使用
      • OCP043第十五讲 Database Security
      • ORACLE10gr2数据导入MySQL方案
      • oracle 让sys用户可以使用isqlplus
      • 在oracle数据库下使用iSQL*Plus DBA访问数据库
      • Oracle行列转换小结
      网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
      Copyright © 2008-2015 计算机技术学习交流网. 版权所有

      豫ICP备11007008号-1