oracle树形查询

1. WITH AS 示例
with 
e as (select * from employees),
d as (select * from departments)
select * from e,d where e.department_id = d.department_id
and d.department_id = 10
 
2. 树形查询 
    2.1 connect by
    兄弟结点排序: order siblings by 
    PRIOR放在子节点一侧,会从start with开始向下寻找子节点
    PRIOR放在父节点一侧,会从start with开始向上寻找父节点 
SELECT e.employee_id,e.salary,e.last_name,e.manager_id,level from employees e
where level =2  --可直接查询某一层级的数据
start with e.employee_id = 100
connect by  e.employee_id =prior e.manager_id
order siblings by e.salary asc  --兄弟结点间排序

  2.2  nocycle

  如果树形结构有嵌套循环的话,会报错ORA-01436,需要在CONNECT BY 后关键字NOCYCLE :

  CONNECT BY NOCYCLE PRIOR

select last_name "Employee",
       level,
       sys_connect_by_path(last_name, '/') "Path"
  from emp
 where level <= 3
   and department_id = 80
 start with last_name = 'King'
connect by nocycle prior employee_id = manager_id;

  2.3  CONNECT_BY _ISLEAF,查询所有的叶子节点,含有子节点的为0 

select sys_connect_by_path(e.last_name, '/')
  from employees e
 where connect_by_isleaf = 1
 start with e.employee_id = 100
connect by prior e.employee_id = e.manager_id

  2.4 CONNECT_BY_ROOT

--如果指定了start_with则获取的是最顶层结点的信息
select e.employee_id,
       e.last_name,
       e.manager_id,
       connect_by_root e.last_name root_last_name,
       connect_by_root e.hire_date root_hire_date
  from employees e
 start with e.employee_id = 100
connect by prior e.employee_id = e.manager_id
--如果为指定start with会依次展示结点的所有的父级结点
with v as  (select e.employee_id,
       e.last_name,
       e.manager_id,
       connect_by_root e.last_name root_last_name,
       connect_by_root e.hire_date root_hire_date
  from employees e
-- start with e.employee_id = 100
connect by prior e.employee_id = e.manager_id)
select * from v where v.employee_id = 206

 

  

 
  
 
 
 

 

 
 
   

转载于:https://www.cnblogs.com/yasun/p/5171543.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值