仅使用一个查询删除重复记录

时间:2011-03-16 11:24:18

标签: sql sql-server-2005

我正在使用SQL Server 2005。

我有一张这样的表 -

ID    Name
1      a
1      a
1      a
2      b
2      b
3      c
4      d
4      d

在此,我想删除所有重复的条目,并只保留一个实例 -

ID     Name
1       a
2       b
3       c
4       d

我可以通过向此表添加另一个标识列并在其中包含唯一编号然后删除重复记录来轻松完成此操作。但是,我想知道是否可以删除重复记录而不将该附加列添加到此表中。

此外,如果只使用一个查询语句就可以完成此操作。即不使用存储过程或临时表。

5 个答案:

答案 0 :(得分:9)

使用ROW_NUMBER中的CTE可以删除重复值,同时保留唯一的行。

WITH q AS (
  SELECT RN = ROW_NUMBER() OVER (PARTITION BY ID ORDER BY ID )
         , ID
         , Name
  FROM   ATable
)
DELETE FROM q WHERE RN > 1

答案 1 :(得分:1)

Lieven是对的...但是你可能想通过在delete语句中添加一个top子句来调整lieven的代码,如下所示:

从q中删除top(1),其中RN> 1;

希望这有帮助

答案 2 :(得分:1)

您可以使用此查询:

delete a from
(select id,name, ROW_NUMBER() over (partition by id,name order by id) row_Count
from dup_table) a
where  a.row_Count >1

答案 3 :(得分:-1)

delete from table1
USING table1, table1 as vtable
WHERE (NOT table1.ID=vtable.ID)
AND (table1.Name=vtable.Name)

答案 4 :(得分:-1)

DELETE FROM tbl
WHERE ID NOT IN (
    SELECT MIN(ID)
    FROM tbl
    GROUP BY Name
)