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操作的事實。
添加回答
舉報