Sql 删除重复行

Sql 删除重复行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一张像这样的桌子 表1 身份证,姓名 如何编写一个查询,删除所有具有重复名称的行,但保留Id较低的行?如果您使用的是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 (

我有一张像这样的桌子

表1

身份证,姓名


如何编写一个查询,删除所有具有重复名称的行,但保留Id较低的行?

如果您使用的是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
                )

只需使用游标即可完成此操作 查询可能是这样的

声明@id int 声明@name nvarchar30

为select id声明cr游标,名称来自idnametbl order by id

更新

开放式cr

将下一个从cr获取到@id,@name

而@@fetch\u status=0

开始

从idnametbl中删除,其中id>@id和name=@name

将下一个从cr获取到@id,@name

结束

闭合cr


解除分配cr

可以通过简单的自连接查询删除重复项。下面的脚本将为您完成此任务

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

此逻辑可用于需要删除重复项的情况。我们应该尽可能避免光标阻塞表格。

创建一个具有唯一行的新表格删除旧表格,然后用旧名称重命名新表格,也许您应该尝试避免添加重复的条目在完成清理后,在名称上添加一个唯一的约束,这样您就不必再次执行此操作。可能重复的