sql mehrere So wählen Sie jede Zeile aus, in der der Spaltenwert NICHT eindeutig ist



sql leere felder abfragen (6)

Ich muss eine SELECT-Anweisung ausführen, die alle Zeilen zurückgibt, bei denen der Wert einer Spalte nicht eindeutig ist (z. B. EmailAddress).

Zum Beispiel, wenn die Tabelle wie folgt aussieht:

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

Ich brauche die Abfrage zurückzugeben:

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

Ich habe viele Beiträge gelesen und vergeblich versucht, verschiedene Anfragen zu beantworten. Die Frage, die meiner Meinung nach funktionieren sollte, ist unten. Kann jemand eine Alternative vorschlagen oder mir sagen, was mit meiner Frage falsch ist?

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

Answer #1

Nur zum Spaß, hier ist ein anderer Weg:

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

Answer #2

Anstatt Subabfragen in Bedingungen zu verwenden, die die Abfragezeit bei großen Datensätzen erhöhen.

Ich würde vorschlagen, Inner Join als bessere Option für dieses Problem zu verwenden.

Betrachtet man die gleiche Tabelle, könnte dies das Ergebnis liefern

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

Für noch bessere Ergebnisse empfehle ich Ihnen, CustomerID oder ein beliebiges eindeutiges Feld Ihrer Tabelle zu verwenden. Die Vervielfältigung von CustomerName ist möglich.


Answer #3

Nun, es gibt eine kleine Änderung, um die nicht eindeutigen Reihen zu finden.

SELECT EmailAddress, CustomerName VON Kunden WHERE EmailAddress NICHT IN (SELECT EmailAddress FROM Kunden GROUP BY EmailAddress HAVING COUNT (*)> 1)


Answer #4

Dies ist wesentlich schneller als der EXISTS Weg:

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

Answer #5

Die Sache, die mit Ihrer Frage falsch ist, ist, dass Sie nach E-Mail und Name gruppieren, die eine Gruppe jedes eindeutigen Satzes von E-Mail und Name kombiniert zusammen bilden und folglich

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

werden als 3 verschiedene Gruppen behandelt, die alle zu 1 einzigen Gruppe gehören.

Bitte verwenden Sie die Abfrage wie folgt:

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

Answer #6
select CustomerName,count(1) from Customers group by CustomerName having count(1) > 1




sql-server-2008