webentwicklung-frage-antwort-db.com.de

So wählen Sie jede Zeile aus, für die der Spaltenwert NICHT eindeutig ist

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

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

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

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

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

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.

4
Naveen Kishan

Abfragebeispiel: 

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