我想删除没有主键时表中的重复行
已定义(非标准化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中找到解决方案