Sütun Değerinin Farklı Olmadığı Her Satır Nasıl Seçilir


154

Bir sütunun değeri farklı değil (örneğin EmailAddress) tüm satırları döndüren bir select deyimi çalıştırmanız gerekiyor.

Örneğin, tablo aşağıdaki gibi görünüyorsa:

CustomerName     EmailAddress
Aaron            aaron@gmail.com
Christy          aaron@gmail.com
Jason            jason@gmail.com
Eric             eric@gmail.com
John             aaron@gmail.com

Geri dönmek için sorguya ihtiyacım var:

Aaron            aaron@gmail.com
Christy          aaron@gmail.com
John             aaron@gmail.com

Birçok yazı okudum ve boşuna farklı sorgular denedim. Çalışması gerektiğine inandığım sorgu aşağıda. Birisi alternatif önerebilir veya sorgumda neyin yanlış olabileceğini söyleyebilir mi?

select EmailAddress, CustomerName from Customers
group by EmailAddress, CustomerName
having COUNT(distinct(EmailAddress)) > 1

Yanıtlar:


263

Bu, EXISTSyoldan önemli ölçüde daha hızlıdır :

SELECT [EmailAddress], [CustomerName] FROM [Customers] WHERE [EmailAddress] IN
  (SELECT [EmailAddress] FROM [Customers] GROUP BY [EmailAddress] HAVING COUNT(*) > 1)

1
Hey, bu cevabın 7 yaşında olduğunu biliyorum, ama hala buralardaysanız nasıl çalıştığını açıklar mısınız? Sorunumu da çözdüm!
Lou

4
Bir kullanarak HAVINGikinci bir yerine burada SELECT...WHEREhangi yürütür ikinci yerine ikinci seçenek, bu tek bir sorgu neden olur SELECT...WHEREçağrı defalarca. Daha fazlasını burada görebilirsiniz: stackoverflow.com/q/9253244/550975
Serj Sagan

Kötü niyetli [EmailAddress] must appear in the GROUP BY clause or be used in an aggregate functionhatayı alıyorum. Tek düzeltme - düzenleme sql_modemi?
Volodymyr Bobyr

[EmailAddress]İçinde IS GROUP BYfıkra
Serj Sagan

51

Sorgunuzla ilgili yanlış olan şey, e-posta ve ada göre gruplandırmanız, her bir benzersiz e-posta ve ad kümesinin bir grubunu oluşturan ve

aaron and aaron@gmail.com
christy and aaron@gmail.com
john and aaron@gmail.com

hepsi tek bir gruba ait olmak üzere 3 farklı grup olarak ele alınmaktadır.

Lütfen sorguyu aşağıda belirtildiği gibi kullanın:

select emailaddress,customername from customers where emailaddress in
(select emailaddress from customers group by emailaddress having count(*) > 1)

21
Kabul edilen yanıtın aksine, orijinal sorguda neyin yanlış olduğuna dair bir açıklama da eklediniz.

12

Peki ya

SELECT EmailAddress, CustomerName FROM Customers a
WHERE Exists ( SELECT emailAddress FROM customers c WHERE a.customerName != c.customerName AND a.EmailAddress = c.EmailAddress)

11
select CustomerName,count(1) from Customers group by CustomerName having count(1) > 1

sayımı "dups" olarak göstermek için küçük bir geliştirme: CustomerName'i seçin, (1)> 1`
değerine

8

Sadece eğlence için, başka bir yol var:

;with counts as (
    select CustomerName, EmailAddress,
      count(*) over (partition by EmailAddress) as num
    from Customers
)
select CustomerName, EmailAddress
from counts
where num > 1

1
CTE sürümü için +1 Kodda kendimizi tekrarlamamalıyız, artık gerekmiyorsa neden SQL'de kendimizi tekrarlamalıyız.
yzorg

1
Sayım sütunu (sayı üzerinden) için _count kullanıyorum. Kolonlar vb _default, _type, _sum gibi SQL anahtar kelimelerle çarpmasıyla, başına ne zaman tutarlı çizgi kullanmak
yzorg

4

Kayıtların çok büyük olduğu sorgu süresini artıracak durumda alt sorgular kullanmak yerine.

Inner Join'ı bu soruna daha iyi bir seçenek olarak kullanmanızı öneririm.

Aynı tablo göz önüne alındığında sonuç elde edilebilir.

SELECT EmailAddress, CustomerName FROM Customers as a 
Inner Join Customers as b on a.CustomerName <> b.CustomerName and a.EmailAddress = b.EmailAddress

Daha iyi sonuçlar için CustomerID, tablonuzun herhangi bir alanını veya benzersiz bir alanını kullanmanızı öneririm . Çoğaltması CustomerNamemümkündür.


-2

Farklı olmayan satırları bulmak için küçük bir değişiklik var.

SELECT EmailAddress, CustomerName FROM Customers WHERE EmailAddress NOT IN
(SELECT EmailAddress FROM Customers GROUP BY EmailAddress HAVING COUNT(*) > 1)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.