Trouver une valeur en double dans différentes colonnes SQL Server

J'ai une table avec des colonnes qui ressemble à ceci.

id phone1 phone2 Phone3 Phone4 phone5 

Je voudrais find les id's où l'un des phonenumbers correspond à un autre. J'ai recherché sur google ce site mais je n'ai pas trouvé de réponse.

Merci d'avance.

// Nisse

Avec un model comme celui-ci, vous devez aller de cette façon:

 SELECT id FROM dbo.TableName WHERE phone1 = phone2 OR phone1 = phone3 OR phone1 = phone4 OR phone1 = phone5 OR phone2 = phone3 OR phone2 = phone4 OR phone2 = phone5 OR phone3 = phone4 OR phone3 = phone5 OR phone4 = phone5 

Si vous avez une autre table où vous stockez ces numéros de téléphone qui sont liés via une key étrangère, vous pouvez faire:

 SELECT t.id FROM dbo.TableName t INNER JOIN dbo.PhoneNumbers p ON t.ID = p.FkID GROUP BY id HAVING COUNT(p.PhoneNumber) <> COUNT(DISTINCT p.PhoneNumber) 

Une autre façon est d'utiliser cross apply avec table valued constructor

 SELECT id FROM Yourtable CROSS apply (VALUES ('Phone1',Phone1), ('Phone2',Phone2), ('Phone3',Phone3), ('Phone4',Phone4), ('Phone5',Phone5)) cs(cname, data) GROUP BY id, data HAVING Count(1) > 1 

Si vous utilisez un model de paire nom-valeur, alors tout ce que vous avez à faire est d'UNPIVOT votre table pour l'get pour returnner datatables à quoi vous voulez qu'elles ressemblent. Si vous n'utilisez pas une table de paires Nom-Valeur, je suggérerais de repenser la design de la table.

Vous pourriez utiliser UNION ALL:

 WITH cte AS ( SELECT id, phone1 AS phone FROM mytable WHERE phone1 IS NOT NULL UNION ALL SELECT id, phone2 AS phone FROM mytable WHERE phone2 IS NOT NULL UNION ALL SELECT id, phone3 AS phone FROM mytable WHERE phone3 IS NOT NULL UNION ALL SELECT id, phone4 AS phone FROM mytable WHERE phone4 IS NOT NULL UNION ALL SELECT id, phone5 AS phone FROM mytable WHERE phone5 IS NOT NULL ) SELECT id FROM ( SELECT id, phone, COUNT(*) FROM cte GROUP BY id, phone HAVING COUNT(*) > 1 ) dup;