Identification SQL en double et mise à jour

J'ai besoin d'aide dans la question ci-dessous. J'ai une table de client CustA qui a des colonnes custid, prénom, nom, phone1, phone2, lastupdateddate. Cette table a des loggings en double. Un logging est considéré en double dans la table CustA lorsque

first name & surname & (phone1 or phone2) is duplicated custid firstname surname phone1 phone2 lastupdateddate 1000 Sam Son 334566 NULL 1-jan-2016 1001 sam son NULL 334566 1-feb-2016 

J'ai utilisé cte pour ce scénario pour partitionner par prénom, nom de famille, téléphone1, téléphone2 en fonction de rownumber. Mais la condition OR rest en tant que challenge pour phone1 ou phone2 dans une requête CTE. S'il vous plaît partagez vos pensées. Appréciez-le.

Trick est ici COALESCE

 With cte as ( select Count()over(partition by firstname, lastname, coalesce(phone1, phone2)) as cnt,* From yourtable ) Select * from CTE WHere cnt > 1 

Cependant, si ce n'est pas le cas, vous pouvez toujours utiliser une expression CASE pour vous assurer que les valeurs sont présentées dans un ordre cohérent.

 WITH cte AS (SELECT COUNT(*) OVER( partition BY firstname, lastname, CASE WHEN phone1 < phone2 THEN phone1 ELSE phone2 END, CASE WHEN phone1 < phone2 THEN phone2 ELSE phone1 END) AS cnt, * FROM yourtable) SELECT * FROM CTE WHERE cnt > 1 

Celui-ci vous donnera aussi la list des dupes (optionnel custid <> A.custid)

 Declare @Yourtable table (custid int,firstname varchar(50),surname varchar(50),phone1 varchar(25),phone2 varchar(25),lastupdate date) Insert into @Yourtable values (1000,'Sam','Son' ,'334566',NULL ,'1-jan-2016'), (1001,'sam','son' ,NULL ,'334566','1-feb-2016'), (1003,'sam','son' ,NULL ,NULL ,'2-feb-2016'), (1002,'Not','ADupe',NULL ,NULL ,'1-feb-2016') Select A.* ,B.Dupes From @YourTable A Cross Apply (Select Dupes=(Select Stuff((Select Distinct ',' + cast(custid as varchar(25)) From @YourTable Where custid<>A.custid and firstname=A.firstname and surname =A.surname and (IsNull(A.phone1,'') in (IsNull(phone1,''),IsNull(phone2,'')) or IsNull(A.phone2,'') in (IsNull(phone1,''),IsNull(phone2,'')) ) For XML Path ('')),1,1,'') ) ) B Where Dupes is not null 

Résultats

 custid firstname surname phone1 phone2 lastupdate Dupes 1000 Sam Son 334566 NULL 2016-01-01 1001,1003 1001 sam son NULL 334566 2016-02-01 1000,1003 1003 sam son NULL NULL 2016-02-02 1000,1001