在关系型数据库里,“上下级”通常体现在同一张表自己关联自己(自连接 / 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 = '张三';
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;
| 场景 | 推荐方式 |
|---|---|
| 只查直接上下级 | 自连接 |
| 查多级上下级 | 递归 CTE |
| 老版本 MySQL | 自连接 + 固定层级 |
如果你有具体数据库(MySQL / Oracle / SQL Server)或具体业务(部门、菜单、分类),我可以给你更贴合的写法。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。