层次查询

层次查询

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';



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值