3 回答
TA贡献1966条经验 获得超4个赞
您可以使用窗口功能执行此操作。它将通过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;
TA贡献1776条经验 获得超12个赞
假设您的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
);
TA贡献1775条经验 获得超11个赞
您可以尝试以下内容:
delete T1
from MyTable T1, MyTable T2
where T1.dupField = T2.dupField
and T1.uniqueField > T2.uniqueField
(这假设您有一个基于整数的唯一字段)
虽然我个人说你最好试图纠正重复条目在发生之前被添加到数据库而不是作为post-it操作的事实。
添加回答
举报