最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
Oracle树形查询:CONNECT BY双向遍历实战详解
时间:2026-05-20 13:00:01 编辑:袖梨 来源:一聚教程网
树形数据处理是数据库开发常见需求,Oracle的CONNECT BY语法提供高效解决方案,本文详解双向遍历实战技巧。

- 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_framefrom auth_sys_menu mleft join auth_sys_menu m1 on m.parent_id = m1.menu_idstart with m.menu_id in ('13')---这里填父级菜单connect by prior m.menu_id = m.parent_idorder 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_framefrom auth_sys_menu mleft join auth_sys_menu m1 on m.parent_id = m1.menu_idstart with m.menu_id in ('1024')----这里填写子菜单connect by prior m.parent_id = m.menu_idorder 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)
六、总结
掌握CONNECT BY双向遍历技巧,可高效处理各类树形数据场景,通过简单语法调整即可实现完整的层级关系查询功能。
相关文章
- 《代号伙伴》汉库珂角色强度解析 05-20
- 海豚听书app使用指南 05-20
- 咒语旅团:装备升级与魔法附魔系统详解 05-20
- C4D怎样为模型创建眼睛 05-20
- MySQL索引分类 最左匹配原则与失效场景解析 05-20
- 如何编写不可变对象Immutable来帮助V8引擎实现高效垃圾回收 05-20