2014-03-03 136 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