PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Suche nach feldübergreifenden Duplikaten in postgresql

So finden Sie alle Zeilen mit (spaltenübergreifenden) doppelten Telefonnummern:

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

So finden Sie alle doppelten Telefonnummern in den beiden Spalten:

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;

Wiederholen der gleichen Zahl in beiden Spalten der gleichen Zeile qualifiziert sich nicht. Ich glaube nicht, dass Sie diese einbeziehen möchten. (Wäre immer noch Rauschen, das es wert wäre, mit einem CHECK nicht zugelassen zu werden Einschränkung.)