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

相关推荐
AI_56787 分钟前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
ccecw24 分钟前
Mysql ONLY_FULL_GROUP_BY模式详解、group by非查询字段报错
数据库·mysql
JH307328 分钟前
达梦数据库与MySQL的核心差异解析:从特性到实践
数据库·mysql
数据知道44 分钟前
PostgreSQL 核心原理:如何利用多核 CPU 加速大数据量扫描(并行查询)
数据库·postgresql
麦聪聊数据2 小时前
Web 原生架构如何重塑企业级数据库协作流?
数据库·sql·低代码·架构
未来之窗软件服务2 小时前
数据库优化提速(四)新加坡房产系统开发数据库表结构—仙盟创梦IDE
数据库·数据库优化·计算机软考
Goat恶霸詹姆斯3 小时前
mysql常用语句
数据库·mysql·oracle
大模型玩家七七4 小时前
梯度累积真的省显存吗?它换走的是什么成本
java·javascript·数据库·人工智能·深度学习
曾经的三心草4 小时前
redis-9-哨兵
数据库·redis·bootstrap
明哥说编程4 小时前
Dataverse自定义表查询优化:D365集成大数据量提速实战【索引配置】
数据库·查询优化·dataverse·dataverse自定义表·索引配置·d365集成·大数据量提速