Posteado por: alfayate | julio 19, 2010

Trucos Oracle: Mostrar los registros repetidos en una Base de Datos

Con registros repetidos me refiero tanto a registros con todos los campos iguales como a registros que tienen el mismo valor en uno o más campos. Vamos a ver el caso más sencillo que es buscar los registros que tienen el mismo valor en un campo determinado. Ojo, cuando digo el mismo valor me refiero a cualquier valor, no a un valor concreto (si no sería demasiado obvio). P.e. buscar a todos los empleados que viven en la misma calle o todas las personas que son compatriotas (tienen la misma nacionalidad). Esto resulta especialmente útil cuando queremos ver qué registros tienen el valor repetido en un campo que pensamos usar como clave o por la razón que sea debería ser único y no es así.

select *

from Tabla T1

where T1.Campo in (select T2.Campo from Tabla T2 group by T2.Campo having count(*) > 1);

En este caso miramos los valores de Campo que se repiten más de una vez. Si en lugar de 1 ponemos otro número podremos ver aquellos registros que están repetidos 3, 4 veces o más (o menos, o como necesitemos). Si lo que queremos es mirar más de un campo, haríamos algo así:

select *

from Tabla T1

where T1.Campo, T1.Campo2 in (select T2.Campo, T2.Campo2 from Tabla T2 group by T2.Campo, T2.Campo2 having count(*) > 1);


Respuestas

  1. sin mucho parametro:
    from tabla
    group by campo
    having count(campo)>1

  2. OK, probe la de alberto y me fue muy bien en la consulta de unos 32,000 registros. gracias son unos maestros.
    select id, campo, count(campo)
    from tabla
    group by campo
    having count(campo)>1;

  3. si la tabla es grande es mucho más rapida la siguiente consulta

    select id, campo, count(campo)
    from tabla
    group by campo
    having count(campo)>1;

    • Excelentes trucos, muchas gracias por el aporte, soy novato en consultas de oracle y estos consejos me ayudaron muy bien. La consulta funcionó a la perfeccion con el ejemplo de Alberto.
      TOMAIO

  4. ahh lo otro quiten el mayor es mas rápido
    SELECT *
    FROM Tabla t1
    WHERE exists
    (
    SELECT t2.Campo
    FROM Tabla t2
    where t2.Campo = t1.Campo
    GROUP BY t2.Campo
    HAVING sign(COUNT (*)-1)= 1);

    • Hola Jathinson. Muchas gracias por tu aportación.

  5. puedes intentar con este otro funciona bien y en algunos casos mejora el tiempo de select

    SELECT *
    FROM Tabla t1
    WHERE exists
    (
    SELECT t2.Campo
    FROM Tabla t2
    where t2.Campo = t1.Campo
    GROUP BY t2.Campo
    HAVING COUNT (*) > 1);

  6. Buenos dias estor hacindo un select a varia tablas donde hay informacion repetida pero yo solo necesito un registro por persona, la consulta le trae el mismo cliente muchas veces, como elimino en la misma consulta lo registros duplicados, ya probe con distinct pero lo que hace es traerme los repetidos en orden, gracias por su ayuda
    select distinct

    • Hola Oscar

      Resulta difícil responderte sin información más concreta sobre tu problema. Por lo que comentas parece que lo que necesitas es un group by (una agrupación). En cualquier sitio de Oracle puedes encontrar información básica sobre qué son y cómo se hacen agrupaciones. Prueba a buscar «group by oracle» o «agrupaciones oracle». Espero que te sea de utilidad.

  7. Gracias viejo!! …me sirvio de mil maravillas el ejemplo!! ;) …DTB! (Y)

    • ¡De nada, joven! Para eso estamos; me alegra de que te hay sido útil.

  8. Excelente gracias

    • Hola

      Me alegro de que te sea de utilidad.

      Un saludo


Replica a JATHINSON Cancelar la respuesta

Categorías