如何删除 SQL Server 表中的重复行(2)

思想:新增一列标识列ID,按某一字段进行分组,保留改组中ID值最小的记录,其余的删除。
    1.首先创建测试数据表

create table testData(
stuNum varchar(20),stuName varchar(20),
class varchar(20),age int,sex varchar(2)
)
insert into testData
select '200810405325','杨宏','计科083',22,'男' union all
select '200810405326','刘华','土木082',24,'男' union all
select '200810405326','刘华','土木082',24,'男' union all
select '200810405328','张叶','会计088',23,'女' union all
select '200810405343','罗雯','建筑085',22,'女' union all
select '200810405343','罗雯','建筑085',22,'女' union all
select '200810405343','罗雯','建筑085',22,'女' union all
select '200810405356','孟兴','桥梁081',25,'男'

      可以看出有两个刘华、三个罗雯,而且其信息一模一样,表中存在重复数据,我们只保留一个。    2.修改表结构,增加一个标识列id

alter table testData add ID int identity(1,1)
    现在我们来看一下表结构:

select * from testData with(nolock)
/*
stuNum               stuName              class                age         sex  ID
-------------------- -------------------- -------------------- ----------- ---- -----------
200810405325         杨宏                   计科083                22          男    1
200810405326         刘华                   土木082                24          男    2
200810405326         刘华                   土木082                24          男    3
200810405328         张叶                   会计088                23          女    4
200810405343         罗雯                   建筑085                22          女    5
200810405343         罗雯                   建筑085                22          女    6
200810405343         罗雯                   建筑085                22          女    7
200810405356         孟兴                   桥梁081                25          男    8
*/
    3.现在我们来删除其中的重复数据,其思想是按照stuNum进行分组,选出每组中ID值最小的记录保留,其余重复的删除。

delete from testData where ID not in(
  select MIN(ID) from testData group by stuNum
)

 我们再来看一下现在表中的数据:重复数据被删除了。

select * from testData with(nolock)
stuNum               stuName              class                age         sex  ID
-------------------- -------------------- -------------------- ----------- ---- -----------
200810405325         杨宏                   计科083                22          男    1
200810405326         刘华                   土木082                24          男    2
200810405328         张叶                   会计088                23          女    4
200810405343         罗雯                   建筑085                22          女    5
200810405356         孟兴                   桥梁081                25          男    8
    4.最后记得删掉之前增加的标识列id

alter table testData drop column ID

这种方法适合于没有主键,数据表中可以重复插入数据的情况。即重复数据所有对应字段都一样。

























  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值