SQL递归查询通过WITH RECURSIVE实现,用于处理层级或图结构数据,如组织架构、物料清单等;它由锚点成员和递归成员组成,利用UNION ALL连接,逐层遍历直到无新数据生成,适用于深度不确定的父子关系查询,但需注意性能、索引、循环引用及数据库递归深度限制等问题。
SQL的递归查询,说白了,就是一种处理层级或图形结构数据的强大工具。它允许我们通过一个初始的“起点”(称为锚点成员)和一套“规则”(递归成员),不断地迭代查询,直到满足某个终止条件。
WITH RECURSIVE
在我看来,理解
WITH RECURSIVE
JOIN
具体来说,一个
WITH RECURSIVE
SELECT
SELECT
这两个成员之间通常用
UNION ALL
UNION
UNION ALL
UNION
在我个人的经验里,每当我遇到数据之间存在“父子关系”或“A依赖B,B又依赖C”这样的链式结构,并且这种链条的深度是不确定的,我就会立刻想到
WITH RECURSIVE
最典型的应用场景包括:
LEFT JOIN
WITH RECURSIVE
说白了,只要你的数据能画成一棵树或者一个有向图,并且你需要遍历这棵树或图的所有节点,
WITH RECURSIVE
我们用一个经典的员工层级结构来演示
WITH RECURSIVE
employees
employee_id
employee_name
manager_id
manager_id
employee_id
目标:找出所有直接或间接向“Alice”(假设她的
employee_id
首先,我们模拟一下数据:
CREATE TABLE employees ( employee_id INT PRIMARY KEY, employee_name VARCHAR(50), manager_id INT ); INSERT INTO employees (employee_id, employee_name, manager_id) VALUES (101, 'Alice', NULL), -- CEO (102, 'Bob', 101), (103, 'Charlie', 101), (104, 'David', 102), (105, 'Eve', 102), (106, 'Frank', 104), (107, 'Grace', 103);
现在,我们来写
WITH RECURSIVE
WITH RECURSIVE EmployeeHierarchy AS ( -- 锚点成员 (Anchor Member): 从Alice开始,她是我们的起点 SELECT e.employee_id, e.employee_name, e.manager_id, 0 AS level -- 标记层级,Alice是第0层 FROM employees e WHERE e.employee_id = 101 -- 指定起始员工ID UNION ALL -- 递归成员 (Recursive Member): 找到当前层级员工的所有下属 SELECT e.employee_id, e.employee_name, e.manager_id, eh.level + 1 AS level -- 下属的层级加1 FROM employees e JOIN EmployeeHierarchy eh ON e.manager_id = eh.employee_id -- 关键:连接到CTE本身 ) SELECT employee_id, employee_name, manager_id, level FROM EmployeeHierarchy ORDER BY level, employee_id;
代码解析:
WITH RECURSIVE EmployeeHierarchy AS (...)
EmployeeHierarchy
SELECT e.employee_id, e.employee_name, e.manager_id, 0 AS level FROM employees e WHERE e.employee_id = 101
level 0
UNION ALL
SELECT e.employee_id, e.employee_name, e.manager_id, eh.level + 1 AS level FROM employees e JOIN EmployeeHierarchy eh ON e.manager_id = eh.employee_id
employees
e
EmployeeHierarchy
eh
e.manager_id = eh.employee_id
manager_id
EmployeeHierarchy
employee_id
eh.level + 1 AS level
这个查询会首先把Alice放进
EmployeeHierarchy
manager_id
EmployeeHierarchy
level 1
manager_id
level 2
EmployeeHierarchy
虽然
WITH RECURSIVE
性能问题:
employee_id
manager_id
无限循环(Cycles):
CYCLE
UNION ALL
UNION
UNION ALL
UNION
MAXRECURSION
OPTION (MAXRECURSION N)
可读性与调试:
WITH RECURSIVE
JOIN
总的来说,
WITH RECURSIVE
以上就是什么是SQL的递归查询?WITH RECURSIVE的用法与场景的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号