sql – 如何删除除一条没有相同列/主键的记录之外的大量重复数据

我想删除没有主键时表中的重复行

已定义(非标准化DB).

我的问题是 – 我的表有大约5.4亿条记录.以前我使用CTE删除记录但是花费的时间超过8小时.我想优化查询.
例如:如果我们有table1,数据如下,

ID FNAME LNAME 
1 AAA CCC
2 BBB DDD
1 AAA CCC
2 BBB DDD
1 AAA CCC
2 BBB DDD
3 BCB DGD

删除重复的行并使用单个查询将数据保存到表中.

ID FNAME LNAME
1 AAA CCC
2 BBB DDD
3 BCB DGD

以前我应用这种类型的查询 –

;with TBLCTE(EmpID,Ranking)
AS
(
select
EmpID,
Ranking = DENSE_RANK() over (PARTITION BY EmpID order by newID())
from @TBL
)
delete from TBLCTE where Ranking > 1
select * from @TBL order by EmpID

但这花费了太多时间.

我想要一个满足这些条件的解决方案:

>没有主键或相同的列
>数据超过5.4亿,查询应该花费更少的时间来删除记录.

最佳答案 试试这个

 WITH TempId AS (
 SELECT *, 
 row_number() OVER(PARTITION BY ID, FNAME,LNAME ORDER BY ID) AS [Num]
 FROM Employee)

DELETE TempId WHERE [Num] > 1

Select * from Employee

在Fiddle http://sqlfiddle.com/#!6/394a9/1中找到解决方案

点赞