删除多字段数据重复且只保留一条
Aidan Engineer

这工作中遇到这样一种情况,需要删除某一列内容相同的数据,但需要保留一行,这一行可能根据某一列的值进行判断

首先开始看表,目前的表结构和数据如下所示:

1
2
3
4
5
6
7
8
9
10
+----+-------+-----+
| id | name | pwd |
+----+-------+-----+
| 1 | aidan | 123 |
| 2 | aidan | 124 |
| 3 | jack | 125 |
| 4 | aidan | 125 |
| 5 | aidan | 125 |
| 6 | alisa | 125 |
+----+-------+-----+

因为数据量不多,所以大家脑补一下,此时我们在有大量数据的情况下进行对 name , pwd 字段的去重是很麻烦的,而且在工作的实际情况中要复杂的多,这条代码是我的老师给我的,适应性很强,而且不同情况需要修改的代码量也不算多。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 删除重复数据只保留一条 
DELETE
from `user`
where (name, pwd) in (
SELECT name, pwd
from (
select name, pwd
from `user`
group by name, pwd
having count(*) > 1
) t
)
and id not in (
SELECT a.id
from (
select min(id) as id
from `user`
group by name, pwd
having count(*) > 1
) a
);

执行此段代码之后, name , pwd 同时相等的数据被删除,也就是行号为 4, 5 的两行,但这里选择保留 id 最小的一行,也就是第 4 行,执行之后的结果为:

1
2
3
4
5
6
7
8
9
+----+-------+-----+
| id | name | pwd |
+----+-------+-----+
| 1 | aidan | 123 |
| 2 | aidan | 124 |
| 3 | jack | 125 |
| 4 | aidan | 125 |
| 6 | alisa | 125 |
+----+-------+-----+

最后放上 SQL 模板,想抄作业的话改改占位内容就能用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DELETE
from $tableName$
where ($fields$) in (
SELECT $fields$
from (
select $fields$
from $tableName$
group by $fields$
having count(*) > 1
) t
)
and id not in (
SELECT a.id
from (
select min(id) as id
from $tableName$
group by $fields$
having count(*) > 1
) a
);
  • 本文标题:删除多字段数据重复且只保留一条
  • 本文作者:Aidan
  • 创建时间:2022-05-07 22:57:01
  • 本文链接:https://aidanblog.top/sql-keep_one_piece/
  • 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
 评论