sql 删除重复数据的方法

--创建表 并在表中添加重复数据
CREATE TABLE [dbo].[repeat](
    [emp_no] [nvarchar](50) NULL,
    [name] [nvarchar](50) NULL,
    [age] [int] NULL
) ON [PRIMARY]

-- 插入测试数据
insert into repeat values('000','zhangSan',20);
insert into repeat values('001','weiMeng',22);
insert into repeat values('002','weiMeng',22);
insert into repeat values('003','liu',23);
insert into repeat values('004','liu',23);
insert into repeat values('005','liu',23);
insert into repeat values('006','li',24);
insert into repeat values('007','li',24);
insert into repeat values('008','li',24);
insert into repeat values('009','li',24);

-- 删除临时数据 方法一 (借助临时表) 适合全部字段重复的情况

select distinct *  into #tmp from repeat  --过滤非重复的数据到临时表
delete from repeat --删除重复表里的所有数据
insert into repeat  select * from #tmp --把临时表的数据 插入到表里
drop table #tmp

--删除临时数据 方法二(借助特殊列-自增长列) 适合部分字段重复的情况

alter table repeat add rowNo int identity(1,1); --添加自增长列
delete from repeat where (select count(*) from repeat r where r.name=repeat.name and r.rowNo < repeat.rowNo ) > 0;
alter table repeat drop column rowNo ;--删除自增长列

说明:如果 r.rowNo < repeat.rowNo   则保留的数据是 最小rowNo 的数据,如果r.rowNo>repeat.rowNo  保留的是最大rowNo的数据, 这个应该不难理解, r.rowNo < repeat.最小的rowNo 肯定不会删除的,同理最大的也不会删除

猜你喜欢

转载自blog.csdn.net/liufeifeinanfeng/article/details/83058780