您的位置:首页 > 数据库 > Oracle

oracle9i学习笔记之十七 分级取回数据

2008-12-13 17:14 253 查看
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用户等等
根据时间段来查询层次关系
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: