You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MariaDB中如何查询员工的上级的上级?自连接还是递归?

两种方案解决多级上级查询需求

1. 固定层级:多次自连接

如果只需要查询固定层级的上级(比如直接上级+上级的上级),可以直接在现有基础上继续自连接,写法简单直接。

扩展你的代码,新增一次左连接来关联上级的上级:

SELECT
    CONCAT(e.first_name, ' ', e.last_name) AS employee,
    CONCAT(s1.first_name, ' ', s1.last_name) AS direct_boss,
    CONCAT(s2.first_name, ' ', s2.last_name) AS boss_of_boss
FROM
    employees e
LEFT JOIN employees s1 ON e.manager_id = s1.employee_id
LEFT JOIN employees s2 ON s1.manager_id = s2.employee_id;

这种方式的缺点是层级固定,如果要查更多层级,就得继续加JOIN,不适合层级不确定的场景。

2. 任意层级:递归CTE(推荐)

如果需要查询不确定层级的上级(比如从普通员工一直查到CEO),MariaDB 10.2及以上版本支持递归CTE(Common Table Expression),可以高效遍历整个层级链。

示例代码:查询每个员工的所有上级,包含层级关系:

WITH RECURSIVE employee_hierarchy AS (
    -- 锚点成员:初始员工数据
    SELECT
        employee_id,
        CONCAT(first_name, ' ', last_name) AS name,
        manager_id,
        0 AS hierarchy_level
    FROM employees
    -- 可以加WHERE条件指定某个员工,比如WHERE employee_id = 100
    UNION ALL
    -- 递归成员:关联上级数据
    SELECT
        e.employee_id,
        CONCAT(e.first_name, ' ', e.last_name) AS name,
        e.manager_id,
        eh.hierarchy_level + 1
    FROM employees e
    JOIN employee_hierarchy eh ON e.employee_id = eh.manager_id
)
SELECT * FROM employee_hierarchy;

如果只需要展示某个员工的上级链条,可以在锚点成员里加WHERE employee_id = [目标员工ID],结果里hierarchy_level越大,层级越高。

方案对比

  • 多次自连接:适合层级明确、固定的场景,代码易读,性能稳定。
  • 递归CTE:适合层级不固定、需要全链路查询的场景,灵活性强,无需手动添加JOIN。

内容的提问来源于stack exchange,提问作者kevinBell

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 10:30:52