在 SQL 中,自连接(Self Join)去重通常用于没有唯一主键或需要按某些字段组合找出重复记录并保留其中一条的场景。下面用清晰示例说明。
自连接就是同一张表自己和自己连接,通过条件判断哪些行是“重复”的,然后只保留需要的一条。
users
+----+------+------+
| id | name | age |
+----+------+------+
| 1 | Tom | 20 |
| 2 | Tom | 20 |
| 3 | Lucy | 22 |
| 4 | Lucy | 22 |
+----+------+------+
目标:
按 name + age 去重,只保留 id 最小的一条
SELECT u1.*
FROM users u1
LEFT JOIN users u2
ON u1.name = u2.name
AND u1.age = u2.age
AND u1.id > u2.id
WHERE u2.id IS NULL;
u1.id > u2.id:找“更老”的重复记录u2.id IS NULL:说明没有比它更小的 id✅ 输出:
1 Tom 20
3 Lucy 22
DELETE u1
FROM users u1
JOIN users u2
ON u1.name = u2.name
AND u1.age = u2.age
AND u1.id > u2.id;
作用:
删除重复行,只保留 id 最小的一条
| 场景 | 是否适合自连接 |
|---|---|
| 完全重复行 | ✅ |
| 部分字段重复 | ✅ |
| 有主键 | ✅(用 id 控制保留) |
| 只想查询不删除 | ✅ |
如果你有具体表结构或业务规则(比如“保留最新时间”),我可以帮你写精准 SQL。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。