Oracle树形查询CONNECT BY双向遍历实战指南

 更新时间:2026年05月19日 09:22:04   作者:【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双向遍历内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • RPM包方式安装Oracle21c的方法详解

    RPM包方式安装Oracle21c的方法详解

    本次安装遇到了一个深坑,CentOS8.0安装时很多不兼容性,强行安装也失败了,提示缺少部分java方式,所以没办法,换用的Oracle Enterprise Linux 8.4 安装很顺畅,一个半小时就完成相应的工作了,具体操作过程一起看看吧
    2021-08-08
  • Oracle MERGE INTO的用法示例介绍

    Oracle MERGE INTO的用法示例介绍

    这篇文章主要介绍了Oracle MERGE INTO的用法,需要的朋友可以参考下
    2014-05-05
  • Oracle外键约束的三种删除行为小结

    Oracle外键约束的三种删除行为小结

    本文主要介绍了Oracle外键约束的三种删除行为小结,分别是默认删除(No Action)、级联删除(Cascade)和置空删除(Set Null),下面就来介绍一下,感兴趣的可以了解一下
    2024-08-08
  • oracle密码过期的彻底解决方案

    oracle密码过期的彻底解决方案

    这篇文章主要为大家详细介绍了oracle密码过期的彻底解决方案,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • Oracle中游标Cursor基本用法详解

    Oracle中游标Cursor基本用法详解

    这篇文章主要介绍了Oracle中游标Cursor基本用法详解,还是比较全面的,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • plsql与tsql的语法不同

    plsql与tsql的语法不同

    plsql与tsql的语法不同简单整理,大家可以参考下。
    2009-09-09
  • Oracle重建索引Shell脚本、SQL脚本分享

    Oracle重建索引Shell脚本、SQL脚本分享

    这篇文章主要介绍了Oracle重建索引Shell脚本、SQL脚本分享,索引是提高数据库查询性能的有力武器,定期重建索引是很有必要的事情,需要的朋友可以参考下
    2014-09-09
  • Oracle时间日期操作方法小结

    Oracle时间日期操作方法小结

    Oracle时间日期操作方法小结,需要的朋友可以参考下。
    2010-11-11
  • Oracle创建主键自增表(sql语句实现)及触发器应用

    Oracle创建主键自增表(sql语句实现)及触发器应用

    主键自增在插入数据的时候是很实用的,可以获取并操作返回的插入记录的ID,接下来介绍Oracle如何创建主键自增表,感兴趣的你可以了解下,就当是巩固知识,希望此文对你有所帮助
    2013-01-01
  • Oracle用decode函数或CASE-WHEN实现自定义排序

    Oracle用decode函数或CASE-WHEN实现自定义排序

    这篇文章主要介绍了Oracle用decode函数或CASE-WHEN实现自定义排序功能,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-05-05

最新评论