PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

rechercher des doublons inter-champs dans postgresql

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.)