温馨提示×

温馨提示×

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

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

怎么用自连接找上下级

发布时间:2026-10-16 01:55:21 来源:亿速云 阅读:85 作者:小樊 栏目:数据库

在关系型数据库里,“上下级”通常体现在同一张表自己关联自己(自连接 / Self Join)。
典型场景是:员工表里有“上级ID”字段。


一、表结构示例

假设有一张员工表 emp:

emp
---------
id       员工ID
name     姓名
manager_id  上级ID(指向同一张表的 id)

示例数据:

id name manager_id
1 张三 NULL
2 李四 1
3 王五 1
4 赵六 2

含义:

  • 张三 是 李四、王五 的上级
  • 李四 是 赵六 的上级

二、基本自连接:查“员工 + 直接上级”

SELECT
    e.name AS 员工,
    m.name AS 上级
FROM emp e
LEFT JOIN emp m
    ON e.manager_id = m.id;

结果:

员工 上级
张三 NULL
李四 张三
王五 张三
赵六 李四

✅ 核心点:

  • e 是“下级表”
  • m 是“上级表”
  • 用 e.manager_id = m.id 连接

三、查“某个员工的下级”

例如:查张三的下级

SELECT e.*
FROM emp e
JOIN emp m
    ON e.manager_id = m.id
WHERE m.name = '张三';

四、查“某个员工的所有上级(递归)”

MySQL 8+ / PostgreSQL(递归 CTE)

WITH RECURSIVE cte AS (
    SELECT * FROM emp WHERE name = '赵六'
    UNION ALL
    SELECT e.*
    FROM emp e
    JOIN cte ON e.id = cte.manager_id
)
SELECT * FROM cte;

五、查“某个员工的所有下级(递归)”

WITH RECURSIVE cte AS (
    SELECT * FROM emp WHERE name = '张三'
    UNION ALL
    SELECT e.*
    FROM emp e
    JOIN cte ON e.manager_id = cte.id
)
SELECT * FROM cte;

六、自连接 vs 递归

场景 推荐方式
只查直接上下级 自连接
查多级上下级 递归 CTE
老版本 MySQL 自连接 + 固定层级

如果你有具体数据库(MySQL / Oracle / SQL Server)或具体业务(部门、菜单、分类),我可以给你更贴合的写法。

向AI问一下细节

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

AI
助
手