sql >> Database >  >> RDS >> PostgreSQL

zoeken naar cross-field duplicaten in postgresql

Om alle rijen met dubbele telefoonnummers (in meerdere kolommen) te vinden:

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

Om alle dubbele telefoonnummers in de twee kolommen te vinden:

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;

Hetzelfde nummer herhalen in beide kolommen van de dezelfde rij komt niet in aanmerking. Ik denk niet dat je die zou willen opnemen. (Zou nog steeds ruis zijn die de moeite waard is om niet toe te staan ​​met een CHECK beperking.)



  1. CS50:LIKE-operator, variabele vervanging met % uitbreiding

  2. CSV-gegevens importeren in de Rails-app, met iets anders dan de associatie-ID

  3. Wat zijn de kosten van CHECK-beperkingen in Postgres 9.x?

  4. MySQL en JSON - transformeer array naar rijen