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

相关推荐
在风中的意志2 小时前
[数据库SQL] [leetcode-183] 183. 从不订购的客户
数据库·sql
档案宝档案管理2 小时前
一键对接OA/ERP/企业微信|档案宝实现业务与档案一体化管理
大数据·数据库·人工智能·档案·档案管理
毕设十刻2 小时前
基于Vue的养老服务平台85123(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
liulanba2 小时前
AI Agent技术完整指南 第二部分:开发框架
网络·数据库·oracle
X.Ming 同学2 小时前
深度解析 Qt 自定义图表视图:频谱图 的设计与高级功能拓展
服务器·网络·数据库
程序猿_极客2 小时前
【node期末作业开发】Node.js+MySQL 实现销售信息管理系统的增删改查(附源码)
数据库·mysql·node.js
liliangcsdn2 小时前
MySQL存储字节类数据的方案示例
java·前端·数据库
qq_366086222 小时前
sql server 整数转百分比
运维·服务器·数据库
oMcLin2 小时前
如何排查 Linux 系统服务器的性能故障问题:使用 `top`、`htop`、`iostat` 等工具
linux·服务器·数据库