PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

cerca duplicati tra campi in postgresql

Per trovare tutte le righe con numeri di telefono duplicati (su più colonne):

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

Per trovare tutti i numeri di telefono duplicati nelle due colonne:

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;

Ripetere lo stesso numero in entrambe le colonne della stessa riga non si qualifica. Non credo che tu voglia includerli. (Sarebbe comunque un rumore che potrebbe valere la pena non consentire con un CHECK vincolo.)