2011-03-16 52 views
7

我使用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 

我可以通过添加另一个身份列于该表,并具有独特的是数字,然后删除重复记录做到这一点很容易。但是,我想知道是否可以删除重复记录而不将该附加列添加到此表中。

此外,如果这只能使用一个查询语句完成。即不使用存储过程或临时表。

+0

为什么你同意[该无效建议编辑](http://stackoverflow.com/review/suggested-edits/1176084) ?请花一些时间来检查它是否正确。 – hims056 2012-12-13 11:11:24

+0

@ hims056 - 现在以正确的方式编辑它。谢谢。 – 2012-12-13 11:16:30

回答

9

使用在CTE一个ROW_NUMBER可以让你同时保留唯一的行删除重复值。

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
delete from table1 
USING table1, table1 as vtable 
WHERE (NOT table1.ID=vtable.ID) 
AND (table1.Name=vtable.Name) 
+0

您确定USING在SQL Server中可用吗?我在USING附近获得语法错误。 – 2011-03-16 11:45:31

+0

对不起,我已经测试过它的MySQL,我认为它也适用于SQL。你会得到什么错误? – Ervin 2011-03-16 14:05:45

+0

没问题,我在USING附近得到不正确的语法。我不认为SQL中有任何USING关键字。它将被转换为FROM。 – 2011-03-16 14:10:17

-1
DELETE FROM tbl 
WHERE ID NOT IN (
    SELECT MIN(ID) 
    FROM tbl 
    GROUP BY Name 
) 
+0

只要提一下,我没有倒下你。但是,重复行的ID也是一样的。但是, – 2011-03-16 11:33:51

+1

这将删除ID <> 1的所有记录,而不是OP需要的记录。 (不是我downvote顺便说一句)。 – 2011-03-16 11:34:46

1

利芬是对......不过你可能希望通过只是在delete语句增加顶部条款这样来调整利芬代码:

从Q(1)删除顶级其中RN> 1;

希望这有助于

0

您可以使用此查询:

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