当前位置: 首页 > news >正文

Oracle 递归函数练习(CONNECT BY + 递归 WITH)

Oracle 实现递归有两种核心方式,也是面试 / 工作高频考点:

  1. CONNECT BY(传统树形查询,适合层级结构)
  2. 递归 WITH(11gR2 + 支持,标准 SQL,功能更强)

我给你整理3 个经典实战练习,带完整表数据、代码、详解,直接复制运行即可练习。


准备测试表(所有练习通用)

先创建部门层级表员工上下级表,插入测试数据:

sql

-- 1. 部门层级表(父部门->子部门) CREATE TABLE dept_tree ( dept_id NUMBER PRIMARY KEY, -- 部门ID dept_name VARCHAR2(50), -- 部门名称 parent_id NUMBER -- 父部门ID ); -- 插入数据(顶级部门parent_id为NULL) INSERT INTO dept_tree VALUES (1, '总公司', NULL); INSERT INTO dept_tree VALUES (2, '华北分公司', 1); INSERT INTO dept_tree VALUES (3, '华南分公司', 1); INSERT INTO dept_tree VALUES (4, '北京事业部', 2); INSERT INTO dept_tree VALUES (5, '深圳事业部', 3); INSERT INTO dept_tree VALUES (6, '海淀办事处', 4); -- 2. 员工上下级表(领导->下属) CREATE TABLE emp_tree ( emp_id NUMBER PRIMARY KEY, -- 员工ID emp_name VARCHAR2(50), -- 员工姓名 manager_id NUMBER -- 领导ID ); INSERT INTO emp_tree VALUES (100, '董事长', NULL); INSERT INTO emp_tree VALUES (101, '总经理', 100); INSERT INTO emp_tree VALUES (102, '销售总监', 101); INSERT INTO emp_tree VALUES (103, '华北经理', 102); INSERT INTO emp_tree VALUES (104, '华南经理', 102); INSERT INTO emp_tree VALUES (105, '北京销售', 103); COMMIT;

练习 1:树形查询(向下递归:查所有子节点)

需求

查询总公司所有子部门(包含层级、路径、根节点)

方法 1:CONNECT BY 树形查询(最常用)

sql

SELECT dept_id, dept_name, parent_id, LEVEL AS 层级, -- 递归层级(根节点=1) SYS_CONNECT_BY_PATH(dept_name, '->') AS 部门路径, -- 拼接层级路径 CONNECT_BY_ROOT dept_name AS 根部门 -- 根节点数据 FROM dept_tree START WITH parent_id IS NULL -- 递归起始点(顶级部门) CONNECT BY PRIOR dept_id = parent_id; -- 递归条件:上一行的部门ID = 当前行父ID

方法 2:递归 WITH(标准 SQL)

sql

WITH recu_dept AS ( -- 1. 锚点成员(起始数据:根节点) SELECT dept_id, dept_name, parent_id, 1 AS 层级 FROM dept_tree WHERE parent_id IS NULL UNION ALL -- 2. 递归成员(循环查询子节点) SELECT d.dept_id, d.dept_name, d.parent_id, rd.层级 + 1 FROM dept_tree d INNER JOIN recu_dept rd ON d.parent_id = rd.dept_id ) SELECT * FROM recu_dept;

练习 2:向上递归(查所有父节点)

需求

查询海淀办事处所有上级部门

代码

sql

SELECT dept_id, dept_name, LEVEL AS 层级, SYS_CONNECT_BY_PATH(dept_name, '<-') AS 上级路径 FROM dept_tree START WITH dept_name = '海淀办事处' -- 起始点:最末级部门 CONNECT BY PRIOR parent_id = dept_id; -- 向上递归:上一行的父ID = 当前行部门ID

练习 3:过滤递归结果(剪枝)

需求

查询华北分公司及其下属部门,排除海淀办事处

代码

sql

SELECT dept_id, dept_name, LEVEL AS 层级 FROM dept_tree START WITH dept_name = '华北分公司' CONNECT BY PRIOR dept_id = parent_id AND dept_name != '海淀办事处'; -- 递归条件中过滤(剪枝)

练习 4:循环检测(处理死循环)

需求

模拟数据死循环(部门 6 的父部门设为自己),查询时避免无限递归

sql

-- 制造死循环 UPDATE dept_tree SET parent_id = 6 WHERE dept_id = 6; COMMIT; -- 查询 + 死循环检测(NOCYCLE + CONNECT_BY_ISCYCLE) SELECT dept_id, dept_name, CONNECT_BY_ISCYCLE AS 是否循环节点, -- 1=循环节点,0=正常 SYS_CONNECT_BY_PATH(dept_name, '->') AS 路径 FROM dept_tree START WITH parent_id IS NULL CONNECT BY NOCYCLE PRIOR dept_id = parent_id; -- NOCYCLE:遇到循环停止递归

核心语法速记

1. CONNECT BY 关键字

表格

关键字作用
START WITH递归起始行
PRIOR代表上一行数据(递归关联条件)
LEVEL当前递归层级(根 = 1)
SYS_CONNECT_BY_PATH拼接层级路径
CONNECT_BY_ROOT获取根节点数据
NOCYCLE避免死循环

2. 递归 WITH 结构

sql

WITH 递归名称 AS ( 锚点成员(起始数据) UNION ALL 递归成员(自连接查询子节点) ) SELECT * FROM 递归名称;

总结

  1. 树形结构(部门 / 员工 / 菜单)优先用CONNECT BY,语法简洁
  2. 复杂递归(多表关联、累计计算)用递归 WITH
  3. 向下递归:PRIOR 子ID = 父ID;向上递归:PRIOR 父ID = 子ID
  4. 死循环必加NOCYCLE
http://www.jsqmd.com/news/563083/

相关文章:

  • DirectX兼容性解决方案:让经典游戏在Windows 10重获新生
  • 多平台网盘直链解析工具:技术原理与应用指南
  • 300 元内降噪耳机横评:倍思 M2s / 绿联 T3 / 漫步者 X5 Pro 实测对比(续航・降噪・延迟全数据)
  • STM32 SPI通信实现24位传感器数据采集
  • 从原理到实战:Linux内核Tracepoint的深度解析与应用
  • 这个网站,我愿称之为生信云平台天花板
  • 2026年AI情商大战:Grok 4.1官网登顶盲测榜,国内镜像站实测与行业分析
  • 7个效率倍增技巧:StarRailAssistant自动化工具解放崩坏星穹铁道玩家双手
  • 禅道二次开发实战:从零构建自定义字段模块
  • YOLOv8特征可视化实战:如何用3种合并模式优化模型调试(附完整代码)
  • 2026跨境网店转让平台综合评测报告 - 优质品牌商家
  • Realistic Vision V5.1 虚拟摄影棚:Visio绘制高可用部署架构图详解
  • ChatGPT等大模型安全指南:从数据泄露防护到模型滥用防范的7个关键策略
  • 深入仓颉编程语言:玩转HashSet集合的实战技巧
  • (二)人工智能算法之监督学习——线性回归
  • 2026宜宾搬家公司可靠推荐榜 - 优质品牌商家
  • 嵌入式通信协议设计的7大黄金原则与实践
  • 如何快速掌握单细胞分析:CELLxGENE新手必看的3个实用技巧
  • 【存储】Erasure-Code(EC)1: 通俗易懂的理解什么是EC
  • Apache SeaTunnel社区发布最新Roadmap:定义数据集成未来
  • 避坑指南:UE4使用VictoryBPLibrary插件读写文件时常见的5个错误及解决方法
  • 用S7-1200搞了个自动洗车机?仿真就能跑
  • 小白友好:InstructPix2Pix极速推理,秒级响应你的修图指令
  • Joy-Con Toolkit:5大维度释放Switch手柄的全部潜能
  • Spring Boot类加载器那些事:从LaunchedURLClassLoader到自定义加载器实战
  • 布隆过滤器与哈希索引:两级验证模型
  • 2024年GitHub热门Java项目Top50:开发者必备工具与框架精选
  • 【深度学习】梯度累加:小显存玩转大模型的训练加速器
  • LeetCode:128. 最长连续序列
  • 还在手写MCP路由和工具适配层?这套经3家AI原生公司验证的Python模板,今天必须部署!