2011-11-30 9 views
7

Istnieje tabela o nazwie z kolumnami id, name, address, ph_no itd.
Potrzebuję znaleźć wiersze z tym samym name, jeśli liczba wierszy jest większa niż 1, pokaż te wiersze.Jak znaleźć kolumnę o tej samej wartości (niektóre wartości x) powtórzonej więcej niż raz? Wymaga zwrócenia tych wierszy.

Na przykład
Tabela: 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******* 

W powyższej tabeli muszę się wierszy z tej samej kolumny name dane jak poniżej:

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

trzeba uzyskać wiersze oparte na nazwie, którą podałem jako argument poniżej: example składnia:

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

Jak mogę uzyskać rozwiązanie powyższego problemu.

+0

czego brakuje dokładnie z już odpowiedzi dany? (jakich detali szukasz) – tbone

Odpowiedz

11

Jako @ vc74 sugeruje funkcje analityczne będą pracować pracę o wiele lepiej tutaj; szczególnie jeśli twoje dane mają dowolną objętość.

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

ograniczając się na konkretnych nazw tabeli contacts naprawdę powinny mieć indeks na name a zapytanie będzie wyglądać następująco:

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

Twój kod działa poprawnie, ale muszę podać "winogronę" jako argument w zapytaniu. –

+0

@azad można dodać klauzulę where, jeśli chcesz. Dodałabym ograniczenie do pod-wybierz i mieć indeks na "nazwa". Oznacza to jednak, że jeśli masz tylko jedno wystąpienie 'where name = 'grape'' twoje zapytanie nie zwróci nic? – Ben

+0

to nie działało. (nie było zwracania wierszy zawierających to pole "winogron" więcej niż jeden raz). plz możesz jeszcze raz sprawdzić! –

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

Jeśli masz dostęp do funkcji analitycznych Oracle nie może być bardziej bezpośredni sposób

1
select * 
from contacts c 
where c.name in (select cc.name 
        from contacts 
        group by cc.name 
        having count(1) > 1); 
Powiązane problemy