首页 >数据库 >mysql教程 >如何从没有主键的SQL表中删除重复记录?

如何从没有主键的SQL表中删除重复记录?

Barbara Streisand
Barbara Streisand原创
2025-01-03 03:13:40170浏览

How to Delete Duplicate Records from an SQL Table Without a Primary Key?

处理没有主键的 SQL 表中的重复记录

在没有主键的情况下,可以从 SQL 表中删除重复记录具有挑战性的。让我们考虑以下场景:

名为“employee”的表包含以下没有主键的记录:

create table employee
(
 EmpId number,
 EmpName varchar2(10),
 EmpSSN varchar2(11)
);

insert into employee values(1, 'Jack', '555-55-5555');
insert into employee values (2, 'Joe', '555-56-5555');
insert into employee values (3, 'Fred', '555-57-5555');
insert into employee values (4, 'Mike', '555-58-5555');
insert into employee values (5, 'Cathy', '555-59-5555');
insert into employee values (6, 'Lisa', '555-70-5555');
insert into employee values (1, 'Jack', '555-55-5555');
insert into employee values (4, 'Mike', '555-58-5555');
insert into employee values (5, 'Cathy', '555-59-5555');
insert into employee values (6 ,'Lisa', '555-70-5555');
insert into employee values (5, 'Cathy', '555-59-5555');
insert into employee values (6, 'Lisa', '555-70-5555');

给定此表,目标是删除重复记录,同时保留独特的。为了实现这一点,我们可以使用“ROW_NUMBER()”函数和“DELETE”语句的组合:

DELETE SUB FROM
(SELECT ROW_NUMBER() OVER (PARTITION BY EmpId, EmpName, EmpSSN ORDER BY EmpId) cnt
 FROM Employee) SUB
WHERE SUB.cnt > 1

分解代码:

  • 内部查询使用 ROW_NUMBER() 函数为每组重复记录的每一行分配一个序号。 PARTITION BY 子句按 EmpId、EmpName 和 EmpSSN 列对数据进行分区,ORDER BY EmpId 确保行按 EmpId 的升序编号。
  • 外部查询使用内部查询中的 cnt 列作为仅选择重复行的过滤器 (cnt > 1)。
  • DELETE 语句使用子查询从原始表中删除重复的行。

通过执行此查询,“employee”表中的重复记录将被删除,只留下唯一的记录:

select * from employee;

EmpId EmpName EmpSSN
1      Jack   555-55-5555
2      Joe    555-56-5555
3      Fred   555-57-5555
4      Mike   555-58-5555
5      Cathy  555-59-5555
6      Lisa   555-70-5555

以上是如何从没有主键的SQL表中删除重复记录?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn