当前所在位置:珠峰网资料 >> 计算机 >> Oracle认证 >> 正文
Oracle树形查找(三)
发布时间:2010/9/21 10:16:11 来源:www.xue.net 编辑:城市总裁吧

  查看king下每一代的个数及平均sal

  SQL> select level,count(*),trunc(avg(sal)) from emp start with mgr is null connect by prior empno=mgr group by level;

  LEVEL  COUNT(*) TRUNC(AVG(SAL))

  ---------- ---------- ---------------

  1         1           5000

  2         3           2758

  4         2            950

  3         8           1731

  确认节点之间是否存在层级关系,如存在,列出层级关系

  这可应用在产品的组装关系,员工的上下级领导关系的判断,如下面语句判断7839和7788是否有层级关系,如果返回结果,则表示存在层级关系

  SQL> select empno,ename,level,sys_connect_by_path(empno,'/') from emp where empno=7788 start with empno=7839 connect by mgr=prior empno;

  EMPNO ENAME          LEVEL SYS_CONNECT_BY_PATH(EMPNO,'/')

  ----- ---------- ---------- --------------------------------------------------------------------------------

  7788 SCOTT              3 /7839/7566/7788

  查找每个部分的老大,增加了限制条件prior deptno<> deptno

  SQL> select deptno,empno,ename,level from emp start with empno=7839 connect by mgr=prior empno and prior deptno<> deptno;

  DEPTNO EMPNO ENAME          LEVEL

  ------ ----- ---------- ----------

  10 7839 KING               1

  20 7566 JONES              2

  30 7698 BLAKE              2

  树形遍历排序order siblings by

  先看一下用普通order取排序的情况

  SQL> select deptno,empno,ename,lpad(empno,length(empno)+(level-1)*4,'-') from emp start with mgr is null connect by prior empno=mgr order by ename;

  DEPTNO EMPNO ENAME     LPAD(EMPNO,LENGTH(EMPNO)+(LEVE

  ------ ----- ---------- --------------------------------------------------------------------------------

  20 7876 ADAMS     ------------7876

  30 7499 ALLEN     --------7499

  30 7698 BLAKE     ----7698

  10 7782 CLARK     ----7782

  20 7902 FORD      --------7902

  30 7900 JAMES     --------7900

  20 7566 JONES     ----7566

  10 7839 KING      7839

  30 7654 MARTIN    --------7654

  10 7934 MILLER    --------7934

  20 7788 SCOTT     --------7788

  20 7369 SMITH     ------------7369

  30 7844 TURNER    --------7844

  30 7521 WARD      --------7521

  原先层次关系已经被打乱了,order关键词后面加上silbings

  SQL> select deptno,empno,ename,lpad(empno,length(empno)+(level-1)*4,'-') from emp start with mgr is null connect by prior empno=mgr order siblings by ename;

  DEPTNO EMPNO ENAME     LPAD(EMPNO,LENGTH(EMPNO)+(LEVE

  ------ ----- ---------- --------------------------------------------------------------------------------

  10 7839 KING      7839

  30 7698 BLAKE     ----7698

  30 7499 ALLEN     --------7499

  30 7900 JAMES     --------7900

  30 7654 MARTIN    --------7654

  30 7844 TURNER    --------7844

  30 7521 WARD      --------7521

  10 7782 CLARK     ----7782

  10 7934 MILLER    --------7934

  20 7566 JONES     ----7566

  20 7902 FORD      --------7902

  20 7369 SMITH     ------------7369

  20 7788 SCOTT     --------7788

  20 7876 ADAMS     ------------7876

  层次关系没有变,每一层(level)内按ename排号序了

广告合作:400-664-0084 全国热线:400-664-0084
Copyright 2010 - 2017 www.my8848.com 珠峰网 粤ICP备15066211号
珠峰网 版权所有 All Rights Reserved