1. 简单的树形查询
我们经常会用一些表来保存上下级的关系,如地区表、员工表、组织机构表等,为了按照上下级关系递归的调用这些数据,就需要用到树形结构,以emp表为例。
语句:
select empno as员工编号, ename as姓名, (prior ename) as主编姓名
from emp startwith empno = '7566'connectby (prior empno) = mgr;
分析:
(1)起点:这个语句以empno = '7566'为起点向下递归查询。
(2)通过操作符prior可以取得上一级的信息,如上面的查询中的主管姓名(prior ename)。
(3) connect by 字句列出了(上一级的编码)等于本级的主管编码。
结果:
2. 根节点、分支节点、叶子节点
在树形结构中常用的两个伪列:level和connect_by_isleaf。level返回当前行所在的等级,connect_by_isleaf返回当前行所在的等级,根节点为1级,其下为2级…….
如果当前节点下没有其他的节点,则connect_by_isleaf返回1,否则返回0。这样就是可以通过level和connect_by_isleaf来判断标识根节点、分支节点与叶子节点。
语句:
select lpad('-', (level - 1) * 2, '-') || empo as员工编号,
mgr as主管编号,
levelas级别,
decode(level, 1, 1) as根节点decode(connect_by_isleaf, 1, 1) as叶子节点,
case
when (connect_by_isleaf = 0andlevel > 1) then
1
endas分支节点
from emp
startwith empo = 7566
connectby (prior empo) = mgr;
结果: