risposta-alla-domanda-sullo-sviluppo-web-bd.com

Come selezionare ogni riga in cui il valore della colonna NON è distinto

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
102
Grasshopper

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)
190
Serj Sagan

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)
37
Seasoned

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)
10
Marc
select CustomerName,count(1) from Customers group by CustomerName having count(1) > 1
8
Nisar

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
4
Chad

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.

4
Naveen Kishan

Esempio di query: 

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