3 回答

TA貢獻(xiàn)1966條經(jīng)驗(yàn) 獲得超4個(gè)贊
您可以使用窗口功能執(zhí)行此操作。它將通過empId命令dupes,并刪除除第一個(gè)之外的所有。
delete x from (
select *, rn=row_number() over (partition by EmployeeName order by empId)
from Employee
) x
where rn > 1;
將其作為選擇運(yùn)行以查看將刪除的內(nèi)容:
select *
from (
select *, rn=row_number() over (partition by EmployeeName order by empId)
from Employee
) x
where rn > 1;

TA貢獻(xiàn)1776條經(jīng)驗(yàn) 獲得超12個(gè)贊
假設(shè)您的Employee表也有一個(gè)唯一列(ID在下面的示例中),以下內(nèi)容將起作用:
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轉(zhuǎn)換為支持的類型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貢獻(xiàn)1775條經(jīng)驗(yàn) 獲得超11個(gè)贊
您可以嘗試以下內(nèi)容:
delete T1
from MyTable T1, MyTable T2
where T1.dupField = T2.dupField
and T1.uniqueField > T2.uniqueField
(這假設(shè)您有一個(gè)基于整數(shù)的唯一字段)
雖然我個(gè)人說你最好試圖糾正重復(fù)條目在發(fā)生之前被添加到數(shù)據(jù)庫而不是作為post-it操作的事實(shí)。
添加回答
舉報(bào)