PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

procure por duplicatas de campo cruzado no postgresql


Para encontrar todas as linhas com números de telefone duplicados (colunas cruzadas):
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
   );

Para encontrar todos os números de telefone duplicados nas duas colunas:
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;

Repetindo o mesmo número em ambas as colunas da mesma linha não qualifica. Eu não acho que você gostaria de incluí-los. (Ainda haveria ruído que valeria a pena desabilitar com um CHECK restrição.)