Como seleccionar cada linha onde o valor da coluna não é distinto

preciso de executar uma instrução de selecção que devolve todas as linhas onde o valor de uma coluna não é distinto (por exemplo, EmailAddress).

por exemplo, se o quadro se apresentar abaixo:

CustomerName     EmailAddress
Aaron            [email protected]
Christy          [email protected]
Jason            [email protected]
Eric             [email protected]
John             [email protected]

preciso da consulta para Voltar:

Aaron            [email protected]
Christy          [email protected]
John             [email protected]

eu li muitos posts e tentei diferentes consultas sem sucesso. A consulta que eu acredito que deve funcionar está abaixo. Alguém pode sugerir uma alternativa ou dizer-me o que pode estar errado com a minha consulta?

select EmailAddress, CustomerName from Customers
group by EmailAddress, CustomerName
having COUNT(distinct(EmailAddress)) > 1
Author: ArianJM, 2012-10-30

7 answers

Isto é significativamente mais rápido do que a maneira EXISTS:

SELECT [EmailAddress], [CustomerName] FROM [Customers] WHERE [EmailAddress] IN
  (SELECT [EmailAddress] FROM [Customers] GROUP BY [EmailAddress] HAVING COUNT(*) > 1)
 172
Author: Serj Sagan, 2017-01-12 01:44:04

A coisa que está incorreta com a sua consulta é que você está agrupando por e-mail e nome, que forma um grupo de cada conjunto único de E-mail e nome combinados e, portanto

aaron and [email protected]
christy and [email protected]
john and [email protected]

São tratados como 3 grupos diferentes, em vez de todos pertencentes a um único grupo.

Por favor, use a pesquisa como indicado abaixo:

select emailaddress,customername from customers where emailaddress in
(select emailaddress from customers group by emailaddress having count(*) > 1)
 30
Author: Seasoned, 2012-10-30 19:49:14

Que tal

SELECT EmailAddress, CustomerName FROM Customers a
WHERE Exists ( SELECT emailAddress FROM customers c WHERE a.customerName != c.customerName AND a.EmailAddress = c.EmailAddress)
 9
Author: Marc, 2012-10-30 19:34:08
select CustomerName,count(1) from Customers group by CustomerName having count(1) > 1
 7
Author: Nisar, 2013-07-03 07:21:53
Só por Diversão, há outra maneira:
;with counts as (
    select CustomerName, EmailAddress,
      count(*) over (partition by EmailAddress) as num
    from Customers
)
select CustomerName, EmailAddress
from counts
where num > 1
 4
Author: Chad, 2012-10-30 19:38:15

Em vez de usar sub-consultas em que condição que irá aumentar o tempo de consulta onde os registros estão em grande.

Eu sugeriria usar a junção interna como melhor opção para este problema.

Considerando a mesma tabela isto pode dar o resultado

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

Para melhores resultados, sugiro que use CustomerID ou qualquer campo único da sua tabela. É possível a duplicação de CustomerName.

 3
Author: Naveen Kishan, 2016-09-19 06:07:55

Bem, há uma pequena alteração para encontrar as linhas não distintas..

Seleccione o endereço de E-mail, Nome Personalizado dos clientes onde o endereço de E-mail não está (Seleccionar o endereço de correio electrónico do grupo de clientes por endereço de correio electrónico com contagem(*) > 1)

 -2
Author: Rashmi Ranjan Ransingh, 2016-01-09 23:18:55