oracle 表树形结构查询递归查询

简介:

WITH RECURSIVE 是一种在关系型数据库中处理递归查询的语法。

举例:

假设我们有一个树形结构数据表 tree_table

包含节点的 ID、父节点的 ID 和节点名称等字段。

示例表数据:

复制代码
+----+-----+------+
| id | pid | name |
+----+-----+------+
| 1  | 0   | A    |
| 2  | 1   | B    |
| 3  | 1   | C    |
| 4  | 2   | D    |
| 5  | 2   | E    |
+----+-----+------+

示例查询:查询 ID 为 2 的节点及其子节点的信息。

执行以下查询语句:

复制代码
WITH RECURSIVE cte (id, pid, level, name) AS (
  SELECT id, pid, 0, name
  FROM tree_table
  WHERE id = 2
  UNION ALL
  SELECT t.id, t.pid, cte.level + 1, t.name
  FROM tree_table t
  JOIN cte ON t.pid = cte.id
)

SELECT id, pid, level, name
FROM cte
ORDER BY id;

查询结果:

复制代码
+----+-----+-------+------+
| id | pid | level | name |
+----+-----+-------+------+
| 2  | 1   | 0     | B    |
| 4  | 2   | 1     | D    |
| 5  | 2   | 1     | E    |
+----+-----+-------+------+

总结:

1. WITH RECURSIVE 语句的含义

WITH RECURSIVE 语句用于执行递归查询,它可以在查询过程中不断地迭代自身,处理具有递归关系的数据。通过递归查询,我们可以处理树形结构、层次关系等复杂数据结构。

2. WITH RECURSIVE 语句的执行方式

WITH RECURSIVE 语句的执行方式主要包括以下几个步骤:

步骤 1:初始化递归表达式(CTE)

WITH RECURSIVE 语句中,我们首先定义一个递归公共表表达式(CTE),并给它一个名称。在初始化时,我们指定 CTE 的初始结果集,作为递归查询的起点。

步骤 2:执行递归查询

WITH RECURSIVE 语句中,我们使用 UNION 或 UNION ALL 运算符将初始结果集与递归部分联接起来。递归部分是指在 CTE 中引用 CTE 本身的部分,通过迭代执行递归部分,我们可以一步步扩展结果集。

步骤 3:停止递归查询

递归查询的停止条件通常是满足特定条件或达到预定的递归深度。一旦停止条件满足,递归查询将停止执行,并返回最终的结果集。

步骤 4:返回结果

WITH RECURSIVE 语句的最后,我们可以通过主查询语句从 CTE 中选择所需的列,并对结果进行排序、过滤或其他操作。

如果不兼容可以使用以下方法:

复制代码
SELECT id, pid, name
FROM tree_table
START WITH id = 2
CONNECT BY PRIOR id = pid
ORDER BY id;
  1. START WITH 子句用于指定起始节点,这里是 id = 2,表示从 id 为 2 的节点开始进行递归查询。

  2. CONNECT BY 子句是递归查询的关键部分。它定义了递归关系,即 PRIOR id = pid,表示递归关系是通过当前行的 id 和父节点的 pid 字段进行连接。PRIOR 是一个关键字,用于引用当前行的前一行。

  3. ORDER BY 子句用于按照 id 对结果进行排序,以得到按照 id 递增的顺序展示递归节点的信息。

建表及数据:

复制代码
CREATE TABLE TREE_TABLE (
  id INT,
  pid INT,
  name VARCHAR(10)
);

INSERT INTO TREE_TABLE (ID,PID,NAME) VALUES
(1,0,'A'),
(2,1,'B'),
(3,1,'C'),
(4,2,'D'),
(5,2,'E'),
(6,3,'F'),
(7,3,'G');
相关推荐
毕设十刻7 分钟前
基于Vue的考勤管理系统8n7j8(程序 + 源码 + 数据库 + 调试部署 + 开发环境配置),配套论文文档字数达万字以上,文末可获取,系统界面展示置于文末
前端·数据库·vue.js
合方圆~小文32 分钟前
不同画面,三个镜头实时监控拍摄方案
数据结构·数据库·人工智能
cqsztech1 小时前
docker环境下 Oracle 19c 标准版如何转换为19c 企业版
docker·oracle·容器
ChrisitineTX2 小时前
凌晨突发Java并发问题:synchronized锁升级导致接口超时,排查过程全记录
java·数据库·oracle
极限实验室2 小时前
Easysearch 2.0.0 性能测试
数据库·性能优化
老华带你飞2 小时前
社团管理|基于Java社团管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端
shayudiandian2 小时前
用LangChain打造你自己的智能问答系统
java·数据库·langchain
马克学长3 小时前
SSM特殊教育学校学生管理系统002k1(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·学生管理系统·特殊教育·ssm 框架
卿雪4 小时前
Redis 线程模型:Redis为什么这么快?Redis为什么引入多线程?
java·数据库·redis·sql·mysql·缓存·golang
梁萌4 小时前
MySQL中innerDB引擎的锁机制
数据库·mysql·索引·表锁·行锁