在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢?.

要求:删除表中多余的重复记录,且保留 id 最小的那一条记录。

CREATE TABLE #temp_data(
id BIGINT PRIMARY KEY IDENTITY,
name NVARCHAR(50),
category INT,--分类id
sort_id INT,--排序id
addtime DATETIME
)

INSERT INTO #temp_data ( name,category,sort_id, addtime )VALUES ( '水果11', 1, 1,GETDATE());
INSERT INTO #temp_data ( name,category,sort_id, addtime )VALUES ( '水果12', 1, 2,GETDATE());
INSERT INTO #temp_data ( name,category,sort_id, addtime )VALUES ( '水果23', 2, 3,GETDATE());
INSERT INTO #temp_data ( name,category,sort_id, addtime )VALUES ( '水果24', 2, 4,GETDATE());
INSERT INTO #temp_data ( name,category,sort_id, addtime )VALUES ( '水果11', 1, 1,GETDATE());
INSERT INTO #temp_data ( name,category,sort_id, addtime )VALUES ( '水果12', 1, 2,GETDATE());


--SELECT * FROM #temp_data
--ROW_NUMBER() OVER
SELECT *,(ROW_NUMBER() OVER(ORDER BY name asc,id asc)) as r_index
FROM #temp_data d


--ORDER BY id --如果再写Order by子句,记录会按后面的Order by子句排序

--ROW_NUMBER() OVER PARTITION BY 记录按后面的order BY 子句排序输出,跟ROW_NUMBER方法产生的序号无关。

delete from #temp_data 
where 
id in (
	select id from (
		SELECT (ROW_NUMBER() OVER(PARTITION BY name ORDER BY id Asc)) as r_index,*
		FROM #temp_data
	) X where r_index> 1
) 
and id not in (
	select   min(id) from #temp_data   group  by name having  count(*)> 1
)

1、查找表中多余的重复记录,重复记录是根据单个字段(id)来判断的。

SELECT (ROW_NUMBER() OVER(PARTITION BY name ORDER BY id Asc)) as r_index,* FROM #temp_data

2. group by name 分组,查询count(*)>1的有重复项的min(id)。也就是最原始的,要保留。

select   min(id) from #temp_data   group  by name having  count(*)> 1

3. 删除重复记录,保留 id 最小的那一条记录 ( id not in (min(id))。

查看结果,相同水果的只保留一条记录,成功~ 

 

 

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐