思想:新增一列标识列ID,按某一字段进行分组,保留改组中ID值最小的记录,其余的删除。
1.首先创建测试数据表
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
这种方法适合于没有主键,数据表中可以重复插入数据的情况。即重复数据所有对应字段都一样。