MsSql

关注公众号 jb51net

关闭
首页 > 数据库 > MsSql > SQL递归查询

SQL语句中实现递归查询操作方法

作者:rchmin

这篇文章给大家介绍SQL语句中实现递归查询操作方法,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

在SQL中实现递归查询操作,通常有两种主要的方法:使用递归公用表表达式(Recursive Common Table Expressions,CTEs)和递归查询函数(例如,在PostgreSQL中使用WITH RECURSIVE,在SQL Server中使用WITH RECURSIVECTE,而在Oracle中使用CONNECT BY)。

数据表定义:

CREATE TABLE employees (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    manager_id INT  -- 指向上级,CEO的manager_id为NULL(或0,通常用NULL表示无上级)
);

初始化数据:

INSERT INTO `employees` (`id`, `name`, `manager_id`) VALUES (101, '马总', NULL);
INSERT INTO `employees` (`id`, `name`, `manager_id`) VALUES (201, '张工', 101);
INSERT INTO `employees` (`id`, `name`, `manager_id`) VALUES (202, '王工', 101);
INSERT INTO `employees` (`id`, `name`, `manager_id`) VALUES (301, '李工', 201);
INSERT INTO `employees` (`id`, `name`, `manager_id`) VALUES (401, '赵工', 301);
INSERT INTO `employees` (`id`, `name`, `manager_id`) VALUES (402, '刘工', 301);

查询需求:

请查询出id=101的人员及其所有的下级信息(包括间接下级),同时标记出下属层级,自身层级设为0;

查询语句(MySQL 8.0+):

要查询 id = 101 的所有下级(包括直接和间接下级),并标记出每个下属所处的层级(1 表示直接下级,2 表示下级的下级,依此类推),可以使用递归公用表表达式(Recursive CTE)。以下是符合要求的 SQL 语句:

WITH RECURSIVE subordinates AS (
    -- 初始查询:找到直接下级(manager_id = 101)
    SELECT 
        id,
        name,
        manager_id,
        0 AS level
    FROM employees
    WHERE id = 101
    UNION ALL
    -- 递归查询:找到下一级下属
    SELECT 
        e.id,
        e.name,
        e.manager_id,
        s.level + 1
    FROM employees e
    INNER JOIN subordinates s ON e.manager_id = s.id
)
SELECT *
FROM subordinates
ORDER BY level, id;

执行结果:

语法解释:

WITH RECURSIVE subordinates AS (...) 是 SQL 中用于定义递归公用表表达式(Recursive Common Table Expression)的语法。下面逐部分解释:

1.WITH关键字

2.RECURSIVE关键字

3.subordinates– CTE 名称(自定义)

4. 括号内的递归定义

递归 CTE 通常由两部分组成,用 UNION ALL 连接:

(1)锚点成员(非递归部分)

SELECT id, name, manager_id, 1 AS level
FROM employees
WHERE id = 101

(2)递归成员(递归部分)

SELECT e.id, e.name, e.manager_id, s.level + 1
FROM employees e
INNER JOIN subordinates s ON e.manager_id = s.id

(3) 终止条件

5. 最终引用

定义完 subordinates 后,外层的 SELECT * FROM subordinates 将返回所有递归收集到的行。

示例执行流程

假设 employees 表有数据:

执行过程:

适用场景

WITH RECURSIVE 是处理此类分层或递归查询的标准 SQL 方法,比使用游标或多次自连接更加简洁高效。

到此这篇关于SQL语句中如何实现递归查询操作的文章就介绍到这了,更多相关SQL递归查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文