sql >> Databasteknik >  >> RDS >> PostgreSQL

sök efter cross-field dubbletter i postgresql

Så här hittar du alla rader med (korskolumn) dubbletter av telefonnummer:

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

Så här hittar du alla duplicerade telefonnummer i de två kolumnerna:

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;

Upprepa samma nummer i båda kolumnerna på samma rad kvalificerar sig inte. Jag tror inte du vill ha med dem. (Skulle fortfarande vara brus som kan vara värt att inte tillåta med en CHECK begränsning.)



  1. Kapslad PIPELINED-funktion

  2. Rangordna användare i mysql efter deras poäng

  3. Hur man lägger till en separator till en sammanfogad sträng i MySQL – CONCAT_WS()

  4. Exakt innebörd av MySQL:s främmande nyckel 'on delete restrict'-klausul