从SQL Server中删除重复记录,其中除主键外的所有值都相同

时间:2016-05-18 21:42:58

标签: sql sql-server sql-server-2008

我的表格包含10多列。

例如:

id   name    date        status   rec_id   ..... etc
-------------------------------------------------------
 1   ssss    01/01/2000  Active    3      .....
 2   ssss    01/01/2000  Active    3      .....
 3   aaaa    11/01/2002  Active    5      .....
 4   aaaa    11/01/2002  Active    5      .....

我想删除此表中的重复记录,我想要下面的结果

     1     ssss    01/01/2000  Active    3      .....
     3     aaaa    11/01/2002  Active    5      .....

我们如何实现这一目标?

我可以删除基于id的重复记录,如下所示

delete from test 
where ID not in (select min(ID)
                 from test 
                 group by name);

它被删除了。但我想确保上述方法是正确的吗?

2 个答案:

答案 0 :(得分:1)

是的,您的查询是在正确的轨道上,但您需要包含定义重复的所有列,而不仅仅是name

DELETE FROM test 
WHERE ID NOT IN
( SELECT MIN(ID) FROM TEST
GROUP BY name, date, rec_id, status , {etc} )

答案 1 :(得分:1)

使用可以使用CTE,如下所示 对于列列表,请使用您希望拥有唯一记录的所有列。 不要在CTE中的列列表中包含您的ID列

WITH DuplicateCTE  
    AS
    (
    SELECT   column1,column2,..,lastcolumn
    ROW_NUMBER() OVER
    (PARTITION BY   column1,column2,..,lastcolumn ORDER BY column1) AS DuplicateCount
    FROM yourtablename
    )  
    DELETE FROM DuplicateCTE WHERE DuplicateCount > 1
    GO