2011-11-30 9 views
7

Hay una tabla llamada contacts con columnas id, name, address, ph_no etc.
Necesito encontrar filas con el mismo name, si las filas cuentan más de 1, muestre esas filas.¿Cómo encontrar la columna con el mismo valor (algún valor x) repetido más de una vez? Necesita devolver esas filas.

Por ejemplo:
Tabla: contacts

id--------name--------address---------ph_no-------- 
111  apple  U.K    99******* 
112  banana  U.S    99******* 
123  grape  INDIA   99******* 
143  orange  S.AFRICA  99******* 
152  grape  KENYA   99******* 

Para la tabla anterior que necesito para obtener las filas con la misma columna de name de datos como el siguiente:

id--------name--------address---------ph_no-------- 
123  grape  INDIA   99******* 
152  grape  KENYA   99******* 

necesito para obtener el filas basadas en el nombre que he dado como argumento como la sintaxis siguiente example:

select * from contacts where name='grape' and it's count(*) >1 return those rows. 

¿Cómo puedo lograr la solución para el problema anterior?

+0

lo que falta precisamente de las respuestas ya ¿dado? (¿Qué detalles está buscando?) – tbone

Respuesta

11

Como sugiere @ vc74 funciones analíticas trabajarían trabajo mucho mejor aquí; especialmente si tus datos tienen algún volumen.

select id, name, address, ph_no ... 
    from (select c.*, count(name) over (partition by name) as name_ct 
      from contacts c) 
where name_ct > 1 
     ; 

EDITAR

la restricción sobre los nombres específicos de la tabla contacts realmente debería tener un índice en name y la consulta se vería así:

select id, name, address, ph_no ... 
    from (select c.*, count(name) over (partition by name) as name_ct 
      from contacts c 
      where name = 'grape') 
where name_ct > 1 
     ; 
+0

su código está funcionando bien, pero tengo que pasar la 'uva' como un argumento para consultar. –

+0

@azad puede agregar una cláusula Where si lo desea. Agregaría restringir en la selección secundaria y tendría un índice en 'nombre'. Sin embargo, significa que si solo tienes una instancia de 'where name = 'grape'', ¿tu consulta no arrojaría nada? – Ben

+0

no estaba funcionando. (no devolvió las filas que contienen ese campo 'uva' más de una vez). Por favor, puedes comprobar una vez más !. –

3
select id, name, address, ph_no 
from contacts 
where name in 
(
    select name from contacts 
    group by name 
    having count(*) > 1 
) 

Si usted tiene acceso a las funciones analíticas de Oracle podría ser una manera más sencilla

1
select * 
from contacts c 
where c.name in (select cc.name 
        from contacts 
        group by cc.name 
        having count(1) > 1); 
Cuestiones relacionadas