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

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

Barbara Streisand
发布: 2025-01-03 03:13:40
原创
141 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板