Skip to content

自连接


自连接(Self Join)是一种特殊的连接方式,指同一张表与自身进行连接
在实际开发中,自连接常用于表示层级、父子关系或上下级从属关系,例如“员工与其上级”、“分类与父分类”、“地区与上级地区”等。

自连接的关键在于——同一张表取不同的别名,从而让数据库将它们视为两张独立的表进行匹配。

SELECT 查询字段
FROM 表A AS a
INNER JOIN 表A AS b ON a.字段名 = b.字段名;
  • 由于是同一张表,必须使用不同的别名;
  • 通常需要指定不同的逻辑角色(如“员工表的上级” vs “员工表的下属”)。

假设有一张员工表 employee

emp_idemp_namemanager_id
1张三NULL
2李四1
3王五1
4赵六2

我们希望查询每个员工的上级姓名:

SELECT e.emp_name AS 员工姓名,
m.emp_name AS 上级姓名
FROM employee AS e
LEFT JOIN employee AS m
ON e.manager_id = m.emp_id;

结果:

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

说明: 这里用 LEFT JOIN 是为了保留所有员工,即使有些员工(如张三)没有上级。

  • 层级结构查询(如地区、省市区、部门树);
  • 父子节点关系(如分类、菜单);
  • 递归数据处理(结合 WITH RECURSIVE 语法);
  • 比较同表中不同行的属性差异(如查找同部门工资最高的员工)。
  • 自连接相当于同表多次扫描;
  • 若数据量大,应确保连接字段(如 manager_id)上有索引;
  • 若层级关系较深,可配合 CTE(公用表表达式) 或递归查询。
WITH RECURSIVE dept_tree AS (
SELECT id, dept_name, parent_id FROM sys_dept WHERE parent_id IS NULL
UNION ALL
SELECT d.id, d.dept_name, d.parent_id
FROM sys_dept d
INNER JOIN dept_tree t ON d.parent_id = t.id
)
SELECT * FROM dept_tree;

对于树形结构数据,递归 CTE 比多层自连接更直观。