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
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)
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)
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)
select CustomerName,count(1) from Customers group by CustomerName having count(1) > 1
;with counts as (
select CustomerName, EmailAddress,
count(*) over (partition by EmailAddress) as num
from Customers
)
select CustomerName, EmailAddress
from counts
where num > 1
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
.
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)