2011-05-29 84 views
3

我有一个表,看起来像这样删除重复的行

表1

ID,姓名

我如何编写一个查询,删除所有行重名,但保持一个更低的ID?

+0

创建一个具有唯一行的新表删除旧的名称,然后用旧名称重命名新的名称,也许你应该尽量避免添加重复的条目 – Ibu 2011-05-29 04:14:24

+4

在完成清理之后,*添加一个UNIQUE约束*名字,所以你不必再做这个工作。 – 2011-05-29 04:21:19

+0

[删除重复行(不要删除所有重复项)](http://stackoverflow.com/questions/3777633/delete-duplicate-rows-dont-delete-all-duplicate) – jmort253 2013-11-07 02:16:16

回答

4

如果您使用的是SQL Server 2005或更高版本:

With Dups As 
    (
    Select Id, Name 
     , Row_Number() Over (Partition By Name Order By Id) As Num 
    From Table1 
    ) 
Delete Table1 
Where Id In (
      Select Id 
      From Dups 
      Where Num > 1 
      ) 

如果使用SQL Server 2000和之前

Delete Table1 
Where Exists (
       Select 1 
       From Table1 As T1 
       Where T1.Name = Table1.Name 
       Having Min(T1.Id) <> Table1.Id 
       ) 
0

只要您可以使用光标 查询可能是这样做(3030)

申报CR光标选择ID,名称来自idnametbl为了通过ID

用于更新

开放CR未来从CR

提取到@ ID,@名

而@@ FETCH_STATUS = 0

开始

从idnametbl删除其中id> @id和名称= @名称

下一个从CR读取到ID @,@名

接近CR

DEALLOCATE CR

2

的副本可以用一个简单的自我联接查询被删除。下面的脚本会为你解决问题。

delete t2 
from Table1 t1 
join Table1 t2 
    on t1.Name = t2.Name 
where t1.Id < t2.Id 

此逻辑可用于需要删除重复项的情况。我们应尽可能避免使用“光标”,因为它会阻止表格。