数据库自连接(Self Join)是指一张表与自身进行连接查询,通常借助表别名来区分“两个副本”。它并不是特殊的 SQL 语法,而是同一张表在逻辑上被当成两张表来用。
下面从「适合场景」「典型例子」「不适合的场景」三个角度说明。
最常见、最典型的使用场景。
例子:
idmanager_id(上级员工 ID)SELECT e.name AS 员工, m.name AS 上级
FROM employee e
LEFT JOIN employee m
ON e.manager_id = m.id;
✅ 适合:
例如:
SELECT a.name, b.name
FROM student a
JOIN student b
ON a.class_id = b.class_id
AND a.id < b.id;
✅ 适合:
例如:
SELECT t1.date, t1.amount, t2.amount AS 昨日
FROM sales t1
JOIN sales t2
ON t1.date = t2.date + 1;
⚠️ 注意:
这类场景现代数据库更推荐用窗口函数(LAG / LEAD)
例如:
SELECT c.name, p.name
FROM category c
JOIN category p
ON c.parent_id = p.id;
✅ 适合 2~3 层 ❌ 不适合无限层级
自连接要一层一层写,SQL 会非常复杂。
✅ 替代方案:
WITH RECURSIVE)例如:
⚠️ 会产生 N² 级别数据量 ✅ 替代:
✅ 用窗口函数更高效、可读性更好
SELECT name,
LAG(amount) OVER (ORDER BY date)
FROM sales;
自连接适合:同一张表中,数据行之间存在“关系”或“对比需求”的场景,尤其是父子、上下级、配对比较。
如果你有具体业务表结构,我可以直接帮你写自连接 SQL 或判断是否该用 CTE / 窗口函数。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。