MySQL 8 中可以使用 CTE(公共表达式)特性实现递归查询。CTE 是一种临时表,可以在 SQL 查询中使用多个 CTE。CTE 可以包含递归查询,允许使用相同的查询来迭代查询结果,直到满足指定的条件。
下面是在 MySQL 8 中使用 CTE 实现递归查询的例子:
假设我们有以下员工表:
CREATE TABLE employees (
emp_id INT PRIMARY KEY,
emp_name VARCHAR(20),
manager_id INT
);
INSERT INTO employees VALUES
(1, 'John', NULL),
(2, 'Jane', 1),
(3, 'Bob', 1),
(4, 'Mary', 2),
(5, 'Tom', 3);
我们可以使用 CTE 实现查询员工及其所有下属的层次结构:
WITH RECURSIVE emp_tree AS (
SELECT emp_id, emp_name, manager_id, 0 AS level
FROM employees
WHERE manager_id IS NULL
UNION ALL
SELECT e.emp_id, e.emp_name, e.manager_id, et.level + 1
FROM employees e
JOIN emp_tree et ON e.manager_id = et.emp_id
)
SELECT emp_id, emp_name, manager_id, level
FROM emp_tree
ORDER BY level, emp_name;
这个查询首先指定一个 CTE,命名为 emp_tree,并定义一个初始查询,查找顶层管理层(manager_id IS NULL)。然后,CTE 内部的递归查询使用联接将下属(e.manager_id = et.emp_id)与上层领导者连接起来。对于每个迭代,CTE 计算一个 level 列,记录一些递归级别。
最后,我们选择 emp_tree CTE 的所有行,并根据 level 和 emp_name 排序。
使用 CTE 可以更方便地实现递归查询。要使用此功能,你需要了解 CTE 的语法和如何在递归查询中使用它。