2014-01-16 25 views
0

我想知道如何根据相同的名字和姓氏删除所有重复的联系人。我知道我必须按名字,姓氏和CustomerID进行分组,但不能弄清楚:在每个组中,我如何确保不会将重复设置删除到Primary。从数据库中删除重复的联系人,但不在分组重复中总是保留主要

我知道这与将主小组作为组中的第一个小组相关,然后删除除第1行以外的每个组中的所有内容。

以下是我有:

Select * 
FROM CustomerContacts 
WHERE CustomerContactID NOT IN 
(
    SELECT MAX(CustomerContactID) 
    FROM CustomerContacts 
    GROUP BY ContactFirstName, ContactLastName, CustomerID 
) 
+0

您如何识别“主”联系?你的SQL不提供任何提示。 –

回答

1

如果你想删除除了一个ID最大的一切,再下面是“概念”,你想做什么:

delete from CustomerContacts 
    where CustomerContractsId <> (select max(CustomerContactId) 
            from CustomerContacts cc2 
            where cc2.ContactFirstName = CustomerContacts.ContactFirstName and 
             cc2.ContactLastName = CustomerContacts.ContactLastName and 
             cc2.CustomerId = CustomerContacts.CustomerId 
           ); 

尽管这是标准SQL,但某些数据库的语法可能略有不同。

EDIT(基于评论):

下获取ID时primary是真实的,或者,如果没有,那么最大的ID:

delete from CustomerContacts 
    where CustomerContractsId <> (select coalesce(max(case when primary then CustomerContactId end), max(CustomerContactId)) 
            from CustomerContacts cc2 
            where cc2.ContactFirstName = CustomerContacts.ContactFirstName and 
             cc2.ContactLastName = CustomerContacts.ContactLastName and 
             cc2.CustomerId = CustomerContacts.CustomerId 
           ); 
+0

我不确定这是否解决了我的问题,如果我错了,请纠正我。在分组重复中,我想确保将其设置为Primary = True而不是任何其他分组。如果没有重复项被设置为Primary = True,那么保存哪个重复项并不重要。因此,我想保存其中的一个副本,但如果其中一个是Primary = True,那么这个副本优先。 – JTunney

+0

完美!谢谢sooooo多! – JTunney