oracle层次查询(二)
d in(
elect employee_id from
s_emp a
start with employee_id=2 --从id=2的员工开始查找其子节点,把整棵树删除
connect by prior employee_id=manager_id)
4)找出每个部门的经理
[sql]
select level,a.* from
s_emp a www.2cto.com
start with manager_id is null
connect by prior employee_id=manager_id and department_id !=prior department_id;--当前行的dept_id不等于前一行的dept_id,即每个子树中选最高等级节点
5)查询一个组织中最高的几个等级
[sql]
select level,a.* from
s_emp a
where level <=2 –查找前两个等级
start with manager_id is null
connect by prior employee_id=manager_id and department_id !=prior department_id;
6)合计层次
有两个需求,一是对一个指定的子树subtree做累加计算salary,一是将每行都作为root节点,然后对属于这个节点的所有子节点累加计算salary。
[sql]
第一种很简单,求下sum就可以了,语句:
select sum(salary) from
s_emp a
start with id=2—比如从id=2开始
connect by prior id=manager_id;
第2个需求,需要用到第1个,对每个root节点求这个树的累加值,然后内部层次查询的开始节点从外层查询获得。
select last_name,salary,(
select sum(salary) from
s_emp www.2cto.com
start with id=a.id –让每个节点都成为root
connect by prior id=manager_id) sumsalary
from s_emp a;
7)找出指定层次中的叶子节点
Leaf(叶子)就是没有子孙的孤立节点。
Oracle 10g提供了一个简单的connect_by_isleaf=1,0表示非叶子节点
[sql]
select level,id,manager_id,last_name, title from s_emp
where connect_by_isleaf=1 –表示查询叶子节点
start with manager_id=2
connect by prior id=manager_id;
7 10g新特性:
① 使用SIBLINGS关键字排序
如果使用order by排序会破坏层次,在oracle10g中,增加了siblings关键字的排序
语法:order siblings by
它会保护层次,并且在每个等级中按expre排序
例子:
[sql]
select level, www.2cto.com
employee_id,last_name,manager_id
from s_emp
start with manager_id is null
connect by prior employee_id=manager_id
order siblings by last_name;
② CONNECT_BY_ROOT
Oracle10g新增connect_by_root,用在列名之前表示此行的根节点的相同列名的值
例子:
[sql]
select connect_by_root last_name root_last_name, connect_by_root employee_id root_id,
employee_id,last_name,manager_id
from s_emp
start with manager_id is null
connect by prior employee_id=manager_id