news 2026/2/14 9:53:31

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/2/12 17:03:36

超详细版Keil调试中Breakpoint表达式设置

用好Keil的“智能断点”,让Bug无处藏身你有没有遇到过这种情况:程序运行时某个全局变量莫名其妙变了,但翻遍代码也没找到是谁改的?或者一个中断服务函数每毫秒执行一次,你想看第100次调用时的状态,结果每次…

作者头像 李华
网站建设 2026/2/6 21:09:11

Animate Plus:现代Web动画技术的演进与前瞻

Animate Plus:现代Web动画技术的演进与前瞻 【免费下载链接】animateplus A animation module for the modern web 项目地址: https://gitcode.com/gh_mirrors/an/animateplus 在当今快速发展的Web技术生态中,动画已成为提升用户体验的关键要素。…

作者头像 李华
网站建设 2026/2/7 11:04:43

GitHub Pages搭建个人博客:发布基于TensorFlow的技术文章

GitHub Pages搭建个人博客:发布基于TensorFlow的技术文章 在深度学习技术飞速发展的今天,越来越多开发者意识到——写出能跑的代码只是第一步,讲清楚它是如何工作的,才是真正价值的体现。尤其是在 TensorFlow 这类复杂框架的应用中…

作者头像 李华
网站建设 2026/2/9 6:47:53

内存安全迫在眉睫,Clang静态分析能否成为C程序员最后防线?

第一章:内存安全迫在眉睫,Clang静态分析能否成为C程序员最后防线?C语言因其高效与贴近硬件的特性,在操作系统、嵌入式系统和高性能计算领域长期占据主导地位。然而,伴随而来的内存安全问题也日益严峻——缓冲区溢出、空…

作者头像 李华
网站建设 2026/2/9 18:23:14

transformer模型详解之Encoder-Decoder架构TensorFlow实现

Transformer模型详解之Encoder-Decoder架构TensorFlow实现 在自然语言处理的发展历程中,序列建模长期被RNN及其变体(如LSTM、GRU)主导。这类模型虽然能捕捉时序依赖,但固有的串行计算特性严重制约了训练效率,尤其在长文…

作者头像 李华