为了账号安全,请及时绑定邮箱和手机立即绑定

删除SQL Server中的重复记录?

/ 猿问

删除SQL Server中的重复记录?

函数式编程 2019-09-20 17:08:29

考虑一个名为EmployeeNametable 的列Employee。目标是根据EmployeeName字段删除重复记录。


EmployeeName

------------

Anand

Anand

Anil

Dipak

Anil

Dipak

Dipak

Anil

使用一个查询,我想删除重复的记录。


如何在SQL Server中使用TSQL?


查看完整描述

3 回答

?
烧仙草VB

您可以使用窗口功能执行此操作。它将通过empId命令dupes,并删除除第一个之外的所有。


delete x from (

  select *, rn=row_number() over (partition by EmployeeName order by empId)

  from Employee 

) x

where rn > 1;

将其作为选择运行以查看将删除的内容:


select *

from (

  select *, rn=row_number() over (partition by EmployeeName order by empId)

  from Employee 

) x

where rn > 1;


查看完整回答
反对 回复 2019-09-20
?
叮当猫咪

假设您的Employee表也有一个唯一列(ID在下面的示例中),以下内容将起作用:


delete from Employee 

where ID not in

(

    select min(ID)

    from Employee 

    group by EmployeeName 

);

这将使表中具有最低ID的版本保留。


编辑

Re McGyver的评论 - 截至SQL 2012


MIN 可以与numeric,char,varchar,uniqueidentifier或datetime列一起使用,但不能与位列一起使用


对于2008 R2及更早版本,


MIN可以与numeric,char,varchar或datetime列一起使用,但不能与位列一起使用(它也不能与GUID一起使用)


对于2008R2,您需要将其GUID转换为支持的类型MIN,例如


delete from GuidEmployees

where CAST(ID AS binary(16)) not in

(

    select min(CAST(ID AS binary(16)))

    from GuidEmployees

    group by EmployeeName 

);


查看完整回答
反对 回复 2019-09-20
?
繁星淼淼

您可以尝试以下内容:


delete T1

from MyTable T1, MyTable T2

where T1.dupField = T2.dupField

and T1.uniqueField > T2.uniqueField  

(这假设您有一个基于整数的唯一字段)


虽然我个人说你最好试图纠正重复条目在发生之前被添加到数据库而不是作为post-it操作的事实。


查看完整回答
反对 回复 2019-09-20

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信