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);

  1. 如果数据量大,考虑使用 NO_CYCLE:

START WITH id = '根节点ID'

CONNECT BY NOCYCLE PRIOR id = parent_id

相关推荐
会游泳的石头22 分钟前
Java 异步事务完成后的监听器:原理、实现与应用场景
java·开发语言·数据库
数智工坊22 分钟前
【操作系统-IO调度】
java·服务器·数据库
星梦清河31 分钟前
MySQL—分组函数
数据库·mysql
霖霖总总1 小时前
[小技巧33]MySQL 事务持久化的一致性保障:binlog 与 redo log 的两阶段提交机制解析
数据库·mysql
九章-1 小时前
2026国产向量数据库选型新趋势:融合架构如何支撑AI与信创双轮驱动
数据库·向量数据库
三不原则2 小时前
故障案例:数据库慢查询导致交易延迟,AIOps 如何自动定位?
运维·数据库
Elieal2 小时前
MybatisPlus难懂点
数据库·mybatis
一只专注api接口开发的技术猿2 小时前
微服务架构下集成淘宝商品 API 的实践与思考
java·大数据·开发语言·数据库·微服务·架构
AC赳赳老秦2 小时前
Dify工作流+DeepSeek:运维自动化闭环(数据采集→报告生成)
android·大数据·运维·数据库·人工智能·golang·deepseek
明洞日记2 小时前
【软考每日一练009】计算机系统性能评价:基准程序分类与 TPC 实战案例详解
大数据·数据库