Devo eseguire un'istruzione select che restituisca tutte le righe in cui il valore di una colonna non è distinto (ad es. EmailAddress).
Ad esempio, se la tabella ha il seguente aspetto:
CustomerName EmailAddress
Aaron [email protected]
Christy [email protected]
Jason [email protected]
Eric [email protected]
John [email protected]
Ho bisogno che la query restituisca:
Aaron [email protected]
Christy [email protected]
John [email protected]
Ho letto molti post e ho provato diverse query inutilmente. La query che credo dovrebbe funzionare è sotto. Qualcuno può suggerire un'alternativa o dirmi cosa potrebbe essere sbagliato nella mia domanda?
select EmailAddress, CustomerName from Customers
group by EmailAddress, CustomerName
having COUNT(distinct(EmailAddress)) > 1
Questo è significativamente più veloce del modo EXISTS
:
SELECT [EmailAddress], [CustomerName] FROM [Customers] WHERE [EmailAddress] IN
(SELECT [EmailAddress] FROM [Customers] GROUP BY [EmailAddress] HAVING COUNT(*) > 1)
La cosa che non è corretta con la tua query è che stai raggruppando per e-mail e nome, che forma un gruppo di ciascun insieme univoco di e-mail e nome combinati insieme e quindi
aaron and [email protected]
christy and [email protected]
john and [email protected]
sono trattati come 3 diversi gruppi, piuttosto tutti appartenenti a 1 singolo gruppo.
Si prega di utilizzare la query come indicato di seguito:
select emailaddress,customername from customers where emailaddress in
(select emailaddress from customers group by emailaddress having count(*) > 1)
Che ne dite di
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
Solo per divertimento, ecco un altro modo:
;with counts as (
select CustomerName, EmailAddress,
count(*) over (partition by EmailAddress) as num
from Customers
)
select CustomerName, EmailAddress
from counts
where num > 1
Anziché utilizzare le query secondarie in cui le condizioni aumentano il tempo di interrogazione in cui i record sono enormi.
Suggerirei di utilizzare Inner Join come migliore opzione per questo problema.
Considerando la stessa tabella questo potrebbe dare il risultato
SELECT EmailAddress, CustomerName FROM Customers as a
Inner Join Customers as b on a.CustomerName <> b.CustomerName and a.EmailAddress = b.EmailAddress
Per risultati ancora migliori ti suggerisco di usare CustomerID
o qualsiasi campo unico della tua tabella. La duplicazione di CustomerName
è possibile.
Esempio di query:
SELECT [EmailAddress], [CustomerName] FROM [Customers] WHERE [EmailAddress] IN
(SELECT [EmailAddress] FROM [Customers] GROUP BY [EmailAddress] HAVING COUNT(*) > 1);