Oracle树形查询CONNECT BY双向遍历实战指南
作者:【JAVA】玩家
本文介绍了Oracle数据库的CONNECTBY语法在处理树形数据(如菜单、组织架构等方面的应用,详述了父向子、子向向两种遍历方式的实现,并法及其条件设置,并提供了适用于MySQL/PostgreSQL的替代方案,总结了使用过程中的注意事项,并给出了Java调用示例,感兴趣的朋友一起看看吧
📢 适用数据库说明:
- Oracle:原生支持
CONNECT BY语法,是处理树形数据的标准方案。 - 达梦数据库(DM):完全兼容 Oracle 的
CONNECT BY语法,可直接使用本文所有示例。 - MySQL / PostgreSQL:不支持
CONNECT BY,请使用WITH RECURSIVE(公共表表达式)实现类似功能。
一、场景说明
处理菜单 / 组织架构等树形数据时,Oracle CONNECT BY 可实现向上、向下两种递归遍历,无需复杂存储过程。
二、核心 SQL 实战
1. 父→子向下遍历(查所有子节点)
select distinct
m.menu_id,
m.parent_id,
m1.menu_name as parent_name,
m.menu_name,
m.menu_abbreviation,
m.display_location,
m.path,
m.icon,
m.order_num,
m.menu_type,
m.is_frame
from auth_sys_menu m
left join auth_sys_menu m1 on m.parent_id = m1.menu_id
start with m.menu_id in ('13')---这里填父级菜单
connect by prior m.menu_id = m.parent_id
order by m.parent_id, m.order_num;效果:返回指定父节点下所有子菜单(含多级后代),用于菜单批量授权、树形展开。
2. 子→父向上遍历(查所有父节点)
select distinct
m.menu_id,
m.parent_id,
m1.menu_name as parent_name,
m.menu_name,
m.menu_abbreviation,
m.display_location,
m.path,
m.icon,
m.order_num,
m.menu_type,
m.is_frame
from auth_sys_menu m
left join auth_sys_menu m1 on m.parent_id = m1.menu_id
start with m.menu_id in ('1024')----这里填写子菜单
connect by prior m.parent_id = m.menu_id
order by m.parent_id, m.order_num;效果:返回指定子节点的所有上级节点(含根节点),用于面包屑导航、权限继承校验。## 三、关键语法对比
| 遍历方向 | CONNECT BY 条件 | 核心作用 |
|---|---|---|
| 父→子 | PRIOR m.menu_id = m.parent_id | 查所有后代节点 |
| 子→父 | PRIOR m.parent_id = m.menu_id | 查所有祖先节点 |
四、避坑要点
- DISTINCT:层级查询易出现重复数据,需去重。
- START WITH:支持 IN 传入多个起始节点,实现多分支遍历。
- ORDER BY:配合 order_num 保证菜单展示顺序。
五、Java 调用示例(MyBatis)
<select id="listChildMenus" resultType="com.xxx.vo.MenuVO">
select distinct
m.menu_id,
m.parent_id,
m1.menu_name as parent_name,
m.menu_name,
m.path,
m.icon
from auth_sys_menu m
left join auth_sys_menu m1 on m.parent_id = m1.menu_id
start with m.menu_id in (#{menuId})
connect by prior m.menu_id = m.parent_id
order by m.parent_id, m.order_num
</select>六、总结
CONNECT BY 是 Oracle 处理树形数据的高效方案,掌握两种遍历方式可覆盖大部分业务场景。通过调整 PRIOR 的位置,即可轻松实现向上、向下两种遍历,覆盖绝大多数菜单、组织架构等业务场景。
到此这篇关于Oracle树形查询CONNECT BY双向遍历实战指南的文章就介绍到这了,更多相关Oracle CONNECT BY双向遍历内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
