SELF JOIN
同一张表自己关联自己。
简介
SELF JOIN 为同一张表分配两个角色别名,再用父子键或前后关系进行连接,常用于员工—主管、分类层级和相邻记录。别名应体现角色,连接方向也要与业务含义一致;若需保留没有主管的根节点,应把内连接改为 LEFT JOIN。
基础语法
SELECT a.name, b.name FROM employees a JOIN employees b ON a.manager_id = b.id;
示例
SELF JOIN 示例
示例把 employees 分别命名为员工 a 与主管 b,通过 a.manager_id = b.id 返回明确的上下级关系。
示例数据表
表名:
employees| id | name | manager_id |
|---|---|---|
| 1 | Alice | NULL |
| 2 | Bob | 1 |
| 3 | Cindy | 1 |
| 4 | David | 2 |
SQL
SELECT a.name AS employee, b.name AS manager FROM employees a JOIN employees b ON a.manager_id = b.id;
运行结果
| employee | manager |
|---|---|
| Bob | Alice |
| Cindy | Alice |
| David | Bob |
常见问题
为什么自连接必须使用表别名?
同一张表扮演不同角色,别名可以区分当前记录与其父级、前一条或匹配记录,并避免字段歧义。
怎样保留没有上级的根节点?
把当前记录放在左侧并使用 LEFT JOIN;根节点没有匹配上级时,右侧字段为 NULL。
层级深度不固定时还能连续自连接吗?
固定层级可以;深度未知时通常应使用递归 CTE,并加入终止条件和循环数据防护。
标签
这篇内容是否清楚?
感谢反馈,我们会把它用于后续内容复核。