2011-11-30 39 views
7

C'è una tabella denominata contacts con colonne id, name, address, ph_no ecc.
Ho bisogno di trovare le righe con lo stesso name, se il numero di righe è superiore a 1, mostra quelle righe.Come trovare la colonna con lo stesso valore (qualche valore x) ripetuto più volte? Ha bisogno di restituire quelle file.

Ad esempio:
Tabella: 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******* 

Per la tabella sopra devo ottenere righe con stessa colonna come name dati qui sotto:

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

devo ottenere la righe basate sul nome che ho dato come argomento come sotto la sintassi example:

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

Come posso ottenere la soluzione per il problema di cui sopra.

+0

ciò che manca esattamente dalle risposte già dato? (quali dettagli stai cercando) – tbone

risposta

11

Come @ vc74 suggerisce funzioni analitiche avrebbe funzionato il lavoro molto meglio qui; soprattutto se i tuoi dati hanno un volume.

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 
     ; 

EDIT

limitazione sui nomi specifici tavolo contacts in realtà dovrebbe avere un indice sul name e la query sarebbe simile a questa:

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

il tuo codice sta funzionando bene, ma ho bisogno di passare il 'uva' come argomento per interrogare. –

+0

@azad è possibile aggiungere una clausola where se si desidera. Aggiungerei restrizioni sulla selezione secondaria e avere un indice su 'nome'. Significa però che se hai solo un'istanza di 'where name = 'grape'' la tua query non restituirà nulla? – Ben

+0

non funzionava. (non era in grado di restituire righe che contengono, quel campo "uva" più di una volta). plz puoi controllare ancora una volta !. –

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

Se si ha accesso alle funzioni analitiche di Oracle ci potrebbe essere un modo più semplice

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