233 votes

Comment sélectionner chaque ligne où la valeur de la colonne n'est pas distincte ?

Je dois exécuter une instruction de sélection qui renvoie toutes les lignes où la valeur d'une colonne n'est pas distincte (par exemple EmailAddress).

Par exemple, si le tableau se présente comme suit :

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

J'ai besoin que la requête renvoie :

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

J'ai lu de nombreux articles et essayé différentes requêtes, sans succès. La requête qui, selon moi, devrait fonctionner est la suivante. Quelqu'un peut-il suggérer une alternative ou me dire ce qui ne va pas dans ma requête ?

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

367voto

Serj Sagan Points 2731

Cette méthode est nettement plus rapide que la méthode EXISTS manière :

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

74voto

Seasoned Points 279

Ce qui n'est pas correct dans votre requête, c'est que vous regroupez par email et par nom, ce qui forme un groupe de chaque ensemble unique d'email et de nom combiné ensemble et donc

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

sont traités comme 3 groupes différents plutôt que d'appartenir tous à un seul groupe.

Veuillez utiliser la requête indiquée ci-dessous :

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

27voto

Nisar Points 1149
select CustomerName,count(1) from Customers group by CustomerName having count(1) > 1

13voto

Marc Points 3783

Et si

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

11voto

Chad Henderson Points 2348

Juste pour le plaisir, voici une autre façon :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X