mysql8如何利用CTE特性实现递归查询?

6 min read

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 的语法和如何在递归查询中使用它。