Ich muss eine select-Anweisung ausführen, die alle Zeilen zurückgibt, bei denen der Wert einer Spalte nicht eindeutig ist (z. B. EmailAddress).
Wenn die Tabelle beispielsweise wie folgt aussieht:
CustomerName EmailAddress
Aaron [email protected]
Christy [email protected]
Jason [email protected]
Eric [email protected]
John [email protected]
Ich brauche die Abfrage, um zurückzukehren:
Aaron [email protected]
Christy [email protected]
John [email protected]
Ich habe viele Beiträge gelesen und verschiedene Abfragen ohne Erfolg ausprobiert. Die Frage, die meiner Meinung nach funktionieren sollte, ist unten. Kann jemand eine Alternative vorschlagen oder mir sagen, was bei meiner Anfrage falsch sein kann?
select EmailAddress, CustomerName from Customers
group by EmailAddress, CustomerName
having COUNT(distinct(EmailAddress)) > 1
Dies ist wesentlich schneller als die EXISTS
-Methode:
SELECT [EmailAddress], [CustomerName] FROM [Customers] WHERE [EmailAddress] IN
(SELECT [EmailAddress] FROM [Customers] GROUP BY [EmailAddress] HAVING COUNT(*) > 1)
Was bei Ihrer Abfrage falsch ist, ist, dass Sie nach E-Mail und Namen gruppieren, die eine Gruppe aus jedem eindeutigen Satz von E-Mail und Namen bilden, die zusammen und daher kombiniert werden
aaron and [email protected]
christy and [email protected]
john and [email protected]
werden als 3 verschiedene Gruppen behandelt, und alle gehören zu einer einzigen Gruppe.
Bitte benutzen Sie die Anfrage wie folgt:
select emailaddress,customername from customers where emailaddress in
(select emailaddress from customers group by emailaddress having count(*) > 1)
Wie wäre es mit
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
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
Anstatt Unterabfragen in where-Bedingungen zu verwenden, die die Abfragezeit erhöhen, wenn Datensätze sehr groß sind.
Ich würde vorschlagen, Inner Join als bessere Option für dieses Problem zu verwenden.
Wenn Sie die gleiche Tabelle betrachten, kann dies zu einem Ergebnis führen
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 eindeutiges Feld Ihrer Tabelle zu verwenden. Duplizierung von CustomerName
ist möglich.
Abfragebeispiel:
SELECT [EmailAddress], [CustomerName] FROM [Customers] WHERE [EmailAddress] IN
(SELECT [EmailAddress] FROM [Customers] GROUP BY [EmailAddress] HAVING COUNT(*) > 1);