2011-11-30 19 views
7

id, name, address, ph_no sütunları olan contacts adlı bir tablo var.
Satır sayısı 1'den büyükse, bu satırları gösterecek şekilde, aynı name numaralı satırları bulmam gerekiyor. ÖrneğinSütun aynı (bazı x değeri) değeri bir kereden fazla tekrarlandığında nasıl bulunur? Bu satırları döndürmek gerekiyor.

:
Tablo: I name veriler aşağıdaki gibi aynı sütun ile satır elde etmek için gerek yukarıdaki tabloda için 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******* 

:

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

Elde gerek example söz dizimi gibi argüman olarak verdiğim isme göre satırlar:

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

Yukarıdaki sorunlara nasıl çözüm bulabilirim.

+0

zaten yanıtlarından tam ne eksik verilen? (sizin için ne detaylar arıyoruz) – tbone

cevap

11

vc74 analitik fonksiyonlar burada çok daha iyi çalışmasını çalışacak anlaşılacağı @ üzere; Özellikle verilerinizde herhangi bir hacim varsa. Belirli isimler üzerinde kısıtlayan

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 
     ; 

DÜZENLEME

tablo contacts gerçekten name üzerinde bir dizin olmalıdır ve sorgu şu şekilde görünecektir:

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

kodunuz çalışıyor, ancak 'üzüm' sorgusuna bir argüman olarak geçmem gerekiyor. –

+0

@azad isterseniz, istediğiniz yere ekleyebilirsiniz. Alt seçime kısıtlama ekleyebilirim ve 'name' üzerinde bir indeks var. Bu, demek oluyor ki, '' name name '' grape '' bir örneğiniz varsa, sorgunuz hiçbir şey vermeyecek mi? – Ben

+0

çalışmıyordu. (içeren satırlar, bu alan 'bir kez daha' üzüm 'dönen değildi). plz tekrar kontrol edebilir misin? –

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

Eğer Oracle'ın analitik fonksiyonlar erişiminiz varsa daha basit yolu olabilir

1
select * 
from contacts c 
where c.name in (select cc.name 
        from contacts 
        group by cc.name 
        having count(1) > 1); 
İlgili konular