自连接(Self Join)是指一张表与自身进行连接查询,在逻辑上把它当成两张或多张“副本表”来用。凡是同一张表中,行与行之间存在某种层级、关联或对比关系的场景,都适合用自连接。
下面按常见场景分类说明:
最典型场景,表中存的是“自己引用自己”的外键。
例子:员工表
emp_id | emp_name | manager_id
1 | 张三 | NULL
2 | 李四 | 1
3 | 王五 | 1
4 | 赵六 | 2
查询“员工及其上级姓名”:
SELECT e.emp_name, m.emp_name AS manager_name
FROM employee e
LEFT JOIN employee m
ON e.manager_id = m.emp_id;
✅ 适合:
用自连接表达时间、顺序、排名关系。
例子:订单表
order_id | user_id | order_date
101 | 1 | 2024-01-01
102 | 1 | 2024-03-01
查询“每个用户的下一次下单时间”:
SELECT a.user_id, a.order_date, b.order_date AS next_order
FROM orders a
LEFT JOIN orders b
ON a.user_id = b.user_id
AND b.order_date > a.order_date;
✅ 适合:
在同一张表里找“符合条件的一对记录”。
例子:学生成绩表
student_id | subject | score
1 | 数学 | 90
1 | 英语 | 80
2 | 数学 | 85
2 | 英语 | 95
查询“数学比英语分高的学生”:
SELECT m.student_id
FROM score m
JOIN score e
ON m.student_id = e.student_id
WHERE m.subject = '数学'
AND e.subject = '英语'
AND m.score > e.score;
✅ 适合:
例子:用户表
SELECT a.id, b.id
FROM user a
JOIN user b
ON a.phone = b.phone
AND a.id < b.id;
✅ 适合:
简单层级用自连接,深层用 递归 CTE + 自连接。
“一张表里,一行要参考另一行”的时候,就用自连接。
如果你有具体业务表结构,我可以直接帮你写自连接 SQL。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。