0

我想要求您删除重复项,但仍保留特定项。通过考虑特定条件删除重复

SerWorkNumber is du

,如果有一个“FD”中的代码不应该删除它的类型。

我将非常apprecated的任何帮助。我被困在:( 谢谢

+0

什么版本的SQL您使用的是? –

+0

谢谢@Tim Biegeleisen。我用MSACCESS – Sero

+0

我写的代码是 > DELETE CD_FD。[SerWorkNumber],CD_FD。[的SerialNo],CD_FD。[ServiceCenter],CD_FD。[ReceivedDate],CD_FD。[类型] FROM CD_FD WHERE((( CD_FD。[SerWorkNumber])In(SELECT [SerWorkNumber] FROM [CD_FD] As Tmp GROUP BY [SerWorkNumber] HAVING Count(*)> 1))AND((CD_FD。[Type])=“CD”)); – Sero

回答

0

最简单的方法来做到这一点,是每行都有一个唯一的标识符,所以如果你还没有一个,创建一个名为“row_id”的新列并设置它到自动编号保存表格,你现在应该在每一行有一个唯一的ID

接下来,你可以构造一个大的丑陋的sql来做你所需要的,但是如果你的表很大,它将不会很好地执行使用子查询,所以最好使用临时表来保存重复的行,然后引用它作为删除语句。

所以首先识别重复项,并存储最小行ID

SELECT a.SerWorkNumber, a.SerialNo, a.Type, Min(a.row_id) AS MinOfrow_id INTO CD_FD_Dups 
FROM CD_FD AS a 
GROUP BY a.SerWorkNumber, a.SerialNo, a.Type 
HAVING count(1) > 1; 

接下来,从实际的表中删除引用上面创建的临时表:

DELETE 
FROM CD_FD AS a 
WHERE EXISTS (
SELECT 1 
FROM CD_FD_Dups d 
WHERE d.SerWorkNumber = a.SerWorkNumber 
     and d.SerialNo = a.SerialNo 
     and d.Type = a.Type 
     and a.row_id > d.MinOfrow_id 
);