温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SQL递归查询怎么实现

发布时间:2026-09-16 12:58:17 来源:亿速云 阅读:89 作者:小樊 栏目:数据库

SQL 递归查询通常是通过 CTE(Common Table Expression,公用表表达式) 配合 WITH RECURSIVE 实现的,主要用于处理树形结构、层级关系、图结构等数据。

下面用最常见的关系型数据库(如 MySQL 8+、PostgreSQL、SQL Server)来说明。


一、基本语法结构

WITH RECURSIVE cte_name AS (
    -- 1. 初始查询(锚点)
    SELECT ...
    FROM table
    WHERE 条件

    UNION [ALL]

    -- 2. 递归查询
    SELECT ...
    FROM table
    JOIN cte_name ON 连接条件
)
SELECT * FROM cte_name;

二、经典示例:员工层级结构

表结构

employee (
    id INT,
    name VARCHAR(50),
    manager_id INT
)

查询某个员工的所有下属(向下递归)

WITH RECURSIVE sub_tree AS (
    -- 起始节点(比如 id = 1 的老板)
    SELECT id, name, manager_id
    FROM employee
    WHERE id = 1

    UNION ALL

    -- 递归查找下属
    SELECT e.id, e.name, e.manager_id
    FROM employee e
    JOIN sub_tree s ON e.manager_id = s.id
)
SELECT * FROM sub_tree;

三、向上递归(查所有上级)

WITH RECURSIVE parent_tree AS (
    SELECT id, name, manager_id
    FROM employee
    WHERE id = 10   -- 某个员工

    UNION ALL

    SELECT e.id, e.name, e.manager_id
    FROM employee e
    JOIN parent_tree p ON e.id = p.manager_id
)
SELECT * FROM parent_tree;

四、带层级的递归(加 level)

WITH RECURSIVE tree AS (
    SELECT id, name, manager_id, 1 AS level
    FROM employee
    WHERE manager_id IS NULL

    UNION ALL

    SELECT e.id, e.name, e.manager_id, t.level + 1
    FROM employee e
    JOIN tree t ON e.manager_id = t.id
)
SELECT * FROM tree;

五、递归的注意事项

  1. 必须有终止条件
    • 否则会无限递归
  2. 一般使用 UNION ALL(效率高)
    • UNION 会去重,性能差
  3. 递归部分只能引用一次 CTE
  4. 不同数据库支持情况:
    • ✅ MySQL 8+
    • ✅ PostgreSQL
    • ✅ SQL Server(不用 RECURSIVE
    • ✅ Oracle(使用 CONNECT BY

六、Oracle 写法(补充)

SELECT id, name, manager_id
FROM employee
START WITH id = 1
CONNECT BY PRIOR id = manager_id;

如果你有具体的业务场景(菜单、分类、组织、评论)使用的数据库类型,我可以给你更贴合的示例。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI