Oracle 层次查询 connect by

本文详细探讨了Oracle数据库中的层次查询,包括如何过滤结果集、使用`WHERE`和`CONNECT BY ... AND ...`过滤节点,利用`lpad()`进行格式化,以及利用`SYS_CONNECT_BY_PATH()`、`CONNECT_BY_ISLEAF`伪列和`CONNECT_BY_ROOT`函数。此外,还特别介绍了Oracle 10g的新特性——sibilings排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


 

oracle 层次查询


语法:
      SELECT ... FROM
           [WHERE condition]                              --过滤某些节点
            [  START WITH [nocycle] start_condition]    --定义查询的起点, 可以使用子查询
          CONNECT BY [[nocycle] PRIOR COLUMN1 = COLUMN2 [AND ...]];   --定义父子关系
          order [ sibilings ] by ...
 
例1:
找出101雇员, 及其全下属/上司
 select *
   from myemp
  start with employee_id = 101
connect by prior employee_id = manager_id;  -- 找下属
-- connect by employee_id = prior manager_id;  --找上司

 

prior在等号哪边,表示哪边是"我的"
找下属:  "我的"employee_id = "别人的"manager_id --> 找出我的下属  (向下查询)
找上司: employee_id = prior manager_id 别人的工号 = 我的经理编号 --> 别人是我的经理 & 别人是我经理的经理 --> 我的上司们
 
注意,level伪列只能和connect by子句结合使用, 否则Oracle会返回错误 ORA-01788: 此查询块中要求 CONNECT BY 子句
 
例2:
统计树形的 层数
SELECT COUNT(DISTINCT LEVEL) 
  FROM EMPLOYEES
 START WITH MANAGER_ID IS NULL
CONNECT BY PRIOR EMPLOYEE_ID = MANAGER_ID;  

 

例3:
统计树的 节点数量 , 例如, 查询每个级别的雇员数量
 
 select count(level)  --在统计树种节点的数量时, 一定不能加distinct!
   from employees
  start with manager_id is null
connect by prior employee_id = manager_id
  group by level; 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值