news 2026/5/10 2:49:35

Oracle 数据库中递归查询

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Oracle 数据库中递归查询

方法一:使用 CONNECT BY(传统方式)
-- 假设表名为 my_table,字段为 id 和 parent_id
SELECT id
FROM my_table
START WITH id = '根节点ID' -- 从根节点开始
CONNECT BY PRIOR id = parent_id -- 递归条件:父节点的 id = 子节点的 parent_id
MINUS -- 去重(可选)


-- 或者使用 NOT EXISTS 来筛选叶子节点
SELECT id
FROM my_table t
WHERE NOT EXISTS (
SELECT 1
FROM my_table t2
WHERE t2.parent_id = t.id
)
START WITH id = '根节点ID'
CONNECT BY PRIOR id = parent_id;


方法二:使用 WITH 递归(推荐,更标准)
WITH RECURSIVE cte AS (
-- 基础查询:从根节点开始
SELECT id, parent_id, 1 as level
FROM my_table
WHERE id = '根节点ID' -- 替换为实际的根节点ID

UNION ALL

-- 递归查询:查找所有子节点
SELECT t.id, t.parent_id, c.level + 1
FROM my_table t
INNER JOIN cte c ON t.parent_id = c.id
)
-- 筛选叶子节点(没有子节点的节点)
SELECT c.id
FROM cte c
WHERE NOT EXISTS (
SELECT 1
FROM my_table t
WHERE t.parent_id = c.id
);
方法三:一步到位(最简洁)
WITH cte AS (
SELECT id, parent_id
FROM my_table
START WITH id = '根节点ID'
CONNECT BY PRIOR id = parent_id
)
SELECT id
FROM cte c
WHERE NOT EXISTS (
SELECT 1 FROM my_table WHERE parent_id = c.id
);
示例
假设数据如下:
id | parent_id
----|----------
A | NULL (根)
B | A
C | A
D | B
E | B
查询根节点 A 的所有叶子节点:
SELECT id
FROM my_table
START WITH id = 'A'
CONNECT BY PRIOR id = parent_id
MINUS
SELECT id
FROM my_table
WHERE parent_id IS NOT NULL;
结果:C, D, E
性能优化建议
1. 创建索引:
CREATE INDEX idx_parent_id ON my_table(parent_id);
CREATE INDEX idx_id ON my_table(id);
2. 如果数据量大,考虑使用 NO_CYCLE:
START WITH id = '根节点ID'
CONNECT BY NOCYCLE PRIOR id = parent_id

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 13:11:32

springboot车辆轨迹可视化分析系统

目录 已开发项目效果实现截图关于博主开发技术介绍 核心代码参考示例1.建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】2.计算目标用户与其他用户的相似度系统测试总结源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式! 已…

作者头像 李华
网站建设 2026/5/2 20:42:27

Java计算机毕设之基于SpringBoot的野生动物园管理系统设计与实现动物园管理系统的设计与实现(完整前后端代码+说明文档+LW,调试定制等)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

作者头像 李华
网站建设 2026/5/3 7:38:25

Obsidian-Douban插件实战指南:构建个人娱乐知识库

Obsidian-Douban插件实战指南:构建个人娱乐知识库 【免费下载链接】obsidian-douban an obsidian plugin that can pull data from douban to your markdown file 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-douban 还在为豆瓣观影记录散乱而烦恼…

作者头像 李华
网站建设 2026/5/1 8:04:08

Goyo.vim终极写作指南:如何在Vim中创建完美专注环境

Goyo.vim终极写作指南:如何在Vim中创建完美专注环境 【免费下载链接】goyo.vim :tulip: Distraction-free writing in Vim 项目地址: https://gitcode.com/gh_mirrors/go/goyo.vim 想要在Vim中享受纯粹、无干扰的写作体验吗?Goyo.vim就是你的理想…

作者头像 李华
网站建设 2026/5/3 11:47:06

C 与 Rust 共享 Arrow 数据缓冲区(零成本抽象的工业级实现路径)

第一章:C 与 Rust 共享 Arrow 数据缓冲区(零成本抽象的工业级实现路径)在高性能数据处理系统中,Apache Arrow 作为列式内存格式的标准,被广泛用于跨语言高效交换结构化数据。当 C 和 Rust 这两种系统级语言协同工作时&…

作者头像 李华
网站建设 2026/5/1 2:40:52

【稀缺技术揭秘】:全球仅5%团队掌握的C语言TPU调度优化技巧

第一章:C 语言 TPU 固件层计算调度实现在嵌入式 AI 加速场景中,TPU(张量处理单元)的高效运行依赖于固件层的精确调度。使用 C 语言实现调度逻辑,能够在资源受限环境下提供低延迟、高吞吐的计算管理能力。固件需协调数据…

作者头像 李华