删除SQL Server中的重复记录?

usr*_*986 85 sql t-sql duplicates delete-row

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

EmployeeName
------------
Anand
Anand
Anil
Dipak
Anil
Dipak
Dipak
Anil
Run Code Online (Sandbox Code Playgroud)

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

如何在SQL Server中使用TSQL?

Joh*_*ibb 206

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

delete x from (
  select *, rn=row_number() over (partition by EmployeeName order by empId)
  from Employee 
) x
where rn > 1;
Run Code Online (Sandbox Code Playgroud)

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

select *
from (
  select *, rn=row_number() over (partition by EmployeeName order by empId)
  from Employee 
) x
where rn > 1;
Run Code Online (Sandbox Code Playgroud)

  • 如果您没有主键,可以使用`ORDER BY(SELECT NULL)`http://stackoverflow.com/a/4812038 (2认同)

Stu*_*tLC 33

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

delete from Employee 
where ID not in
(
    select min(ID)
    from Employee 
    group by EmployeeName 
);
Run Code Online (Sandbox Code Playgroud)

这将使表中具有最低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 
);
Run Code Online (Sandbox Code Playgroud)

SqlFiddle适用于Sql 2008中的各种类型

SqlFiddle适用于Sql 2012中的各种类型


Ben*_*ley 8

您可以尝试以下内容:

delete T1
from MyTable T1, MyTable T2
where T1.dupField = T2.dupField
and T1.uniqueField > T2.uniqueField  
Run Code Online (Sandbox Code Playgroud)

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

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