Pour rechercher toutes les lignes avec des numéros de téléphone en double (intercolonnes) :
SELECT *
FROM contacts c
WHERE EXISTS (
SELECT FROM contacts x
WHERE x.mobile_phone IN (c.mobile_phone, c.home_phone)
OR x.home_phone IN (c.mobile_phone, c.home_phone)
AND x.contact_id <> c.contact_id -- except self
);
Pour rechercher tous les numéros de téléphone en double dans les deux colonnes :
SELECT DISTINCT phone
FROM (
SELECT mobile_phone AS phone
FROM contacts c
WHERE EXISTS (
SELECT FROM mobile_phone x
WHERE c.mobile_phone IN (x.mobile_phone, x.home_phone)
AND c.contact_id <> x.contact_id -- except self
)
UNION ALL
SELECT home_phone
FROM contacts c
WHERE EXISTS (
SELECT FROM mobile_phone x
WHERE c.home_phone = x.home_phone -- cross-over covered by 1s SELECT
AND c.contact_id <> x.contact_id -- except self
)
) sub;
Répéter le même nombre dans les deux colonnes de la même ligne ne se qualifie pas. Je ne pense pas que vous voudriez les inclure. (Ce serait toujours du bruit qui pourrait valoir la peine d'être interdit avec un CHECK
contrainte.)