【SQL练习】有一张员工工资表(EMP),表有两列:员工编号(ID),工资(SALARY),请给出SQL删除ID重复的记录,只保留第一条,不需要考虑表中存在完全相同记录的情况。

有一张员工工资表(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
);

解释:

  1. 使用GROUP BY id对每个员工分组
  2. 使用MIN(rowid)获取每个ID分组中rowid最小的记录(即第一条记录)
  3. 删除那些rowid不在上述结果集中的记录,即保留每个ID的第一条记录,删除其他重复记录

执行效果:

  • 原始数据:ID为1的有3条记录,ID为2的有2条记录
  • 执行后:每个ID只保留最早插入的那条记录
  • ID=1:保留(1, 100)
  • ID=2:保留(2, 100)

这种方法利用了Oracle的rowid伪列来标识每条记录的物理位置,确保准确删除重复记录。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值