有一张员工工资表(EMP),表有两列:员工编号(ID),工资(SALARY),请给出SQL删除ID重复的记录,只保留第一条,不需要考虑表中存在完全相同记录的情况。
create table emp (
id number(4),
salary number(4)
);
insert into emp(id, salary) values (1, 100);
insert into emp(id, salary) values (2, 100);
insert into emp(id, salary) values (1, 200);
insert into emp(id, salary) values (2, 200);
insert into emp(id, salary) values (1, 300);
commit;
需要删除ID重复的记录,只保留每个ID的第一条记录。以下是实现该需求的SQL语句:
DELETE FROM emp
WHERE rowid NOT IN (
SELECT MIN(rowid)
FROM emp
GROUP BY id
);
解释:
- 使用
GROUP BY id对每个员工分组 - 使用
MIN(rowid)获取每个ID分组中rowid最小的记录(即第一条记录) - 删除那些rowid不在上述结果集中的记录,即保留每个ID的第一条记录,删除其他重复记录
执行效果:
- 原始数据:ID为1的有3条记录,ID为2的有2条记录
- 执行后:每个ID只保留最早插入的那条记录
- ID=1:保留(1, 100)
- ID=2:保留(2, 100)
这种方法利用了Oracle的rowid伪列来标识每条记录的物理位置,确保准确删除重复记录。


被折叠的 条评论
为什么被折叠?



