您可以使用窗口功能执行此操作。它将通过empId命令dupes,并删除除第一个之外的所有。delete x from ( select *, rn=row_number() over (partition by EmployeeName order by empId) from Employee ) xwhere rn > 1;将其作为选择运行以查看将删除的内容:select *from ( select *, rn=row_number() over (partition by EmployeeName order by empId) from Employee ) xwhere rn > 1;
假设您的Employee表也有一个唯一列(ID在下面的示例中),以下内容将起作用:delete from Employee where ID not in( select min(ID) from Employee group by EmployeeName );这将使表中具有最低ID的版本保留。编辑Re McGyver的评论 - 截至SQL 2012MIN 可以与numeric,char,varchar,uniqueidentifier或datetime列一起使用,但不能与位列一起使用对于2008 R2及更早版本,MIN可以与numeric,char,varchar或datetime列一起使用,但不能与位列一起使用(它也不能与GUID一起使用)对于2008R2,您需要将其GUID转换为支持的类型MIN,例如delete from GuidEmployeeswhere CAST(ID AS binary(16)) not in( select min(CAST(ID AS binary(16))) from GuidEmployees group by EmployeeName );