1. 程式人生 > >sql 刪除重複資料的方法

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 肯定不會刪除的,同理最大的也不會刪除