层次查询
emp表中的职员职位都是有上下级关系的
总裁king
|
/ \
经理jones 经理blake
| |
管理scott 职员james
|
职员adams
当表有层次结构时,通过使用层次查询可以更直观的显示数据结果和层次关系
语法:
select [level],column,expr... from table
[where condition]
start with condition
connect by [prior column1 = column2 | column1 = prior column2];
伪列 level 用于返回层次查询的层次(1:根行 2:第2级行 3:第3级行...)
start with 用于指定层关系 此查询的根行
决定了爬树的起点
connect by 用于指定父行和子行的关系 当定义父行和子行的关系时,必须使用prior关键字
决定了爬树的方向:
prior
用于指定哪个是父级列
SCOTT@ora10g> col ename for a15
SCOTT@ora10g> select lpad('-',LEVEL,'-')||ename ename from emp start with (ename='ADAMS') connect by PRIOR mgr= empno;
ENAME
---------------
-ADAMS
--SCOTT
---JONES
----KING
SCOTT@ora10g>
SCOTT@ora10g> select lpad('-',LEVEL,'-')||ename ename from emp start with (ename='JONES') connect by mgr= PRIOR empno;
ENAME
---------------
-JONES
--SCOTT
---ADAMS
--FORD
---SMITH
SCOTT@ora10g>
剪枝方法:
剪枝条件出现在where子句,剪一个节点
select level,lpad(ename,length(ename)+level*2-2,' ') ename
from emp
where ename!='BLAKE'
start with ename='KING'
connect by prior empno=mgr;
剪枝条件出现在connect by prior子句,剪一个分支
select level,lpad(ename,length(ename)+level*2-2,' ') ename
from emp
start with ename='KING'
connect by prior empno=mgr
and ename!='BLAKE';