2014-03-03 79 views
0

我正在使用SQL Server 2008 R2。如何删除重复的行

我发现重复行使用此脚本:

SELECT CLDest, CdClient, 
COUNT(CLDest) AS NumOccurrences 
FROM DEST 
GROUP BY CLDest,CdClient 
HAVING (COUNT(CLDest) > 1) 

它返回48项

之前,我删除我必须确保我删除双打:

SELECT DEST.CdClient 
     ,DEST.CLDest 
FROM [Soft8Exp_Client_WEB].[dbo].[DEST] 
WHERE DEST.CdClient IN (SELECT CdClient 
         FROM DEST 
         GROUP BY CdClient 
         HAVING (COUNT(CLDest) > 1)) 
    AND DEST.CLDest IN (SELECT CLDest 
         FROM DEST 
         GROUP BY CLDest 
         HAVING (COUNT(CLDest) > 1)) 

这个查询返回64628个条目

所以我想我的选择是错误的。

+0

重复:http://stackoverflow.com/questions/18932/how-can-i-remove-duplicate-rows选择一切成组,并保持的第一个项目每一个小组。 – MrFox

+0

你为什么要用'和'语句?你首先查询发现所有双打。所以你不需要查询中的第二个'in'。在第一个子查询后停止查询,然后尝试。 –

+0

第二个查询是删除...当我返回正确的条目,然后我可以替换选择与删除 – user609511

回答

1
;WITH Duplicates 
AS 
    (
    SELECT CLDest 
     , CdClient 
     , ROW_NUMBER() OVER (PARTITION BY CLDest, CdClient ORDER BY CdClient) AS Rn 
    FROM DEST 
    ) 
DELETE FROM Duplicates 
WHERE RN > 1 
2

SQL Server具有可更新CTE的良好属性。当与功能相结合row_number(),这你想要做什么:

with todelete as (
     select d.*, 
      row_number() over (partition by CLDest, CdClient order by newid()) as seqnum 
     from dest d 
    ) 
delete from todelete 
    where seqnum > 1; 

这个版本会随机删除重复的一个。它的作用是为具有相同值的行分配一个连续编号,并删除除第一个找到的所有行以外的所有行。如果您想按日期保留某些内容,请在order by中使用不同的表达式。

0
SELECT DEST.CdClient,DEST.CLDest 
FROM [Soft8Exp_Client_WEB].[dbo].[DEST] 
WHERE DEST.CdClient+DEST.CLDest 
    IN (
    SELECT CdClient+CLDest FROM DEST GROUP BY CLDest HAVING (COUNT(CLDest) > 1) 
    ) 
+0

请解释_why_你的答案是否有效。 – ArtB