1.分级查询
SELECT [LEVEL],column,expr...
FROM table
[WHERE condition(s)]
[START WITH condition(s)]
[CONNECT BY PRIOR condition(s)];
LEVEL:对每行返回一个级别,对根行LEVEL伪列返回1;对孩子的LEVEL伪列返回2,以此类推
START WITH:指定层次的根行
CONNCT BY PRIOR:指定查询的方向
1)START WITH子句可以和任何有效的条件协同使用
START WITH column1=value
2)使用emp表,从名字是KING的雇员开始
...START WITH ename='KING'
...START WITH mgr IS NULL
3)一个START WITH条件可以包含子查询
...START WITH empno=(SELECT empno
FROM emp
WHERE ename='KING')
CONNECT BY PRIOR column1=column2
4)使用emp表从顶向下遍历:
...CONNECT BY PRIOR empno=mgr
5)使用emp表从底向上遍历:
...CONNECT BY empno=PRIOR mgr
2.遍历树:
1)自顶向下遍历
例:
SELECT level,empno,ename||' 雇员的经理是 '||
PRIOR ename "雇佣关系"
FROM emp
START WITH ename='KING'
CONNECT BY PRIOR empno=mgr;
结果:
LEVEL EMPNO 雇佣关系
1 7839 KING 雇员的经理是
2 7566 JONES 雇员的经理是 KING
3 7788 SCOTT 雇员的经理是 JONES
4 7876 ADAMS 雇员的经理是 SCOTT
3 7902 FORD 雇员的经理是 JONES
4 7369 SMITH 雇员的经理是 FORD
2 7698 BLAKE 雇员的经理是 KING
3 7499 ALLEN 雇员的经理是 BLAKE
3 7521 WARD 雇员的经理是 BLAKE
3 7654 MARTIN 雇员的经理是 BLAKE
3 7844 TURNER 雇员的经理是 BLAKE
3 7900 JAMES 雇员的经理是 BLAKE
2 7782 CLARK 雇员的经理是 KING
3 7934 MILLER 雇员的经理是 CLARK
2)从底向上遍历
例:
SELECT level,empno,ename,job,mgr
FROM emp
START WITH empno=7876
CONNECT BY empno=PRIOR mgr;
结果:
LEVEL EMPNO ENAME JOB MGR
1 7876 ADAMS CLERK 7788
2 7788 SCOTT ANALYST 7566
3 7566 JONES MANAGER 7839
4 7839 KING PRESIDENT
3.用LEVEL和LPAD格式化分级报告
创建一个报告,显示公司的管理层,从最高级别开始,缩进下面跟随的级别
例:
SELECT LEVEL,LPAD(ename,LENGTH(ename)+(LEVEL*2)-2,'-') AS org_chart
FROM emp
START WITH ename='KING'
CONNECT BY PRIOR empno=mgr;
结果:
LEVEL ORG_CHART
1 KING
2 --JONES
3 ----SCOTT
4 ------ADAMS
3 ----FORD
4 ------SMITH
2 --BLAKE
3 ----ALLEN
3 ----WARD
3 ----MARTIN
3 ----TURNER
3 ----JAMES
2 --CLARK
3 ----MILLER
4.修剪分支
1)用WHERE子句去除一个结点
WHERE ename!='SCOTT'
2)用CONNECT BY子句去除一个分支
CONNECT BY PRIOR
empno=mgr
AND ename!='SCOTT'
练习
1.设计一个表,记录客户在一段时间内所拨打电话的树形层次结构。如A用户5点打给B用户,5点10分打给C用户;B用户5点5分打给D用户;D用户6点打给E用户等等
根据时间段来查询层次关系
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/luyangever/archive/2008/12/13/3510765.aspx