Oracle 层级查询(Hierarchical Queries)

如果一张表中的数据存在分级(即数据间存在父子关系),利用普通SQL语句显示数据间的层级关系非常复杂,可能需要多次连接才能完整的展示出完成的层级关系,更困难的是你可能不知道数据到底有多少层。而利用Oracle的层级查询,则可以很方便的显示出层级。

一、语法简介

层级关系定义语法如由start withconnect by两个子句构成:

start withconnect by [nocycle] [prior] …
或
connect by [nocycle] [prior]start with
  • start with …,定义根节点,即层级关系的起点
  • connect by …,定义层级关系,即上下级的连接条件
  • prior,层级关系中指定父级列
  • nocycle,当层级关系出现循环时依然输出结果,和connect_by_iscycle配合使用

相关伪列/函数/排序:

  • level,显示当前记录所在的层级,根节点的层级为1,下级为2,依次类推
  • sys_connect_by_path,显示指定列的完整层级关系,可以自定义连接符
  • connect_by_isleaf,判断当前记录是否叶子节点(没有子孙节点)
  • connect_by_iscycle,和nocycle配合使用,判断层级关系是否存在循环
  • connect_by_root …,显示当前记录的根节点相关信息
  • order siblings by …,按照层级依次排序,即先按层级1排序,再按层级2排序,依次类推

二、应用示例

我们以Oracle Sample Schema中的hr.employees表来演示。这张雇员表中的记录通过2个字段定义上下级关系,employee_id为雇员编号,manager_id为上级的雇员编号,例如King的employee_id为100,他的manager_id是空(没有上级),Kochhar的manager_id是100,代表他的上级是King:

select last_name, employee_id, manager_id from employees;

在这里插入图片描述

2.1 基本层级查询

下面的SQL查询每位雇员的层级,同时用通过伪列evel显示出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值