WITH CTE AS( SELECT *,ROW_NUMBER() OVER(PARTITION BY col1,col2 ORDER BY id) AS rn FROM YourTable ) DELETE FROM CTE WHERE rn > 1;
网友实测一
我用这个方法清理了100万条数据,速度飞起!先用ROW_NUMBER()分区排序标记重复行,然后DELETE掉rn>1的。比DISTINCT快多了,实测1分钟搞定。
网友实测二
高效去重SQL:SELECT DISTINCT * INTO #Temp FROM TableName; TRUNCATE TABLE TableName; INSERT INTO TableName SELECT * FROM #Temp; DROP TABLE #Temp; 这招网友推荐,清理海量重复数据超快。
网友实测三
查重用这个:SELECT col1,col2,COUNT(*) FROM Table GROUP BY col1,col2 HAVING COUNT(*)>1; 然后去重用CTEs方法,亲测在SQL Server 2016上,10万行数据秒杀。
网友实测四
另一个实测神招:CREATE TABLE NewTable AS SELECT DISTINCT * FROM OldTable; 然后DROP老表,重命名新表。简单粗暴,速度取决于磁盘IO,但网友说比MERGE快3倍。
网友实测五
用MERGE语句去重:MERGE Target AS t USING (SELECT DISTINCT * FROM Source) AS s ON t.id=s.id WHEN NOT MATCHED THEN INSERT ... ; 网友测试大表有效,但CTEs更快。
网友实测六
快速查重:SELECT * FROM (SELECT *, COUNT(*) OVER(PARTITION BY col1,col2) AS cnt FROM Table) t WHERE cnt>1; 去重直接DELETE配合ROW_NUMBER,百万级数据网友实测只需几分钟。
FAQ
Q: 去重后主键ID会乱吗?
A: 会,因为DELETE后ID不自动重置,用DBCC CHECKIDENT('Table', RESEED, 0)重置。
Q: 哪些列算重复?
A: PARTITION BY你指定的所有业务关键列,比如姓名+手机号。
Q: 大表怎么优化?
A: 加索引到分区列,先备份,再分批DELETE。
Q: SQL Server版本要求?
A: 2005+都支持CTEs,推荐2012+用窗口函数。
Q: 怎么防止未来重复?
A: INSERT时用UNIQUE INDEX或触发器检查。