# Gleiche Datensätze in EINER Tabelle raussuchen



## Kai-Behncke (13. Juli 2005)

Hallo liebe Leute,
in meiner Tabelle (access) habe ich mehrere Spalten mit jeweils über 1000 Datensätzen.
In der Spalte "Email" möchte ich nun die Daten finden, wo sich die Emailadresse gleicht, also z.B.:
Mr.X     X-Weg      abc@web.de
Mr.Y    Y-Weg      abc@web.de

Ich weiß, dass ich auch die Daten sortieren kann und dann die doppelten Einträge manuell rausfischen, aber ich suche den mysql-Befehl, welcher mir die Datensätze mit jeweils gleichen Emailadressen rausspuckt.
Ich habe schon probiert: "SELECT * from Tabelle Where Email = Email", aber da gibt der natürlich alle Datensätze raus (also eben auch jene, wo die Emailadresse nur einmal 
auftaucht).
Was könnte ich da machen?


----------



## andi_g69 (13. Juli 2005)

Was isses denn nun? Access oder MySQL? 

  Zumindest in Access sollte es so funktionieren, bei MySQL gibt es Subqueries wohl nicht in allen Versionen:

  SELECT * From Tabelle Where Email IN (
  SELECT email
  FROM Tabelle
  GROUP BY email
  HAVING Count (1) > 1
  )


----------



## Kai-Behncke (14. Juli 2005)

Na klar, das ist ja auch logisch. Super. Vielen Dank.


----------



## freichle (20. Juni 2007)

Wie kann man das mit einem zusätzlichen Parameter machen, z.B. noch zusätzlich Vornamen.

Das heißt ich vergleiche Datensätze nach Vorname und Email, ob diese Kombination häufiger vorkommt.

SELECT * From Tabelle Where Email IN (
SELECT email
FROM Tabelle
) AND
Vorname IN (
SELECT email
FROM Tabelle
)
Damit komme ich ja nichtg weit, weil ich dann für beide Felder immer übereinstimmungen kriege, aber nie für beide zusammen.


----------



## d2wap (20. Juni 2007)

So sollte es gehen:


```
SELECT * From Tabelle Where Email AND Vorname IN (
SELECT email, vorname
FROM Tabelle
)
```


----------



## freichle (20. Juni 2007)

Da kommt dann die Fehlermeldung das mein subquery zuviele colums hat


----------



## d2wap (20. Juni 2007)

Und das hier:
(die WHERE-Klausel einfach nochmal einklammern)


```
SELECT * From Tabelle Where (Email IN (
SELECT email
FROM Tabelle
) AND
Vorname IN (
SELECT email
FROM Tabelle
))
```


----------



## freichle (20. Juni 2007)

Verhält sich genauso... der schaut dann nur nach den einzelnen Feldern und addiert sie dann


----------



## lmarkus31 (20. Juni 2007)

Hallo,

du kannst nach jeder Spalte gruppieren, aber auch nach mehreren.


```
select vorname,
       email,
       COUNT(*) AS anzahl
  from tabelle 
 group by vorname,email 
having count(*) > 1
```

Wenn du eine Subquery machen möchtest, die mehrere Spalten zurückliefert, wäre die Syntax die folgende:


```
select * 
  FROM tabelle 
 WHERE (vorname,email) IN
      select vorname,email 
        from tabelle 
       group by vorname,email 
      having COUNT(*)>1)
```

wobei du hier natürlich wieder Duplikate hast

hoffe es hilft,
Markus


----------



## mart (21. Juni 2007)

Hi,

wie wäre es damit:


```
select * from tabelle t where t.email in (
  select email from
    (
      select count(*) as anzahl, email from tabelle group by email
    )
    where anzahl > 1)
```

Also im Prinzip holst Du Dir erst die emails, die mehr als einen Eintrag haben (denn nur dann kann es ja Duplikate geben) und im obersten Select holst Du alle Datensätze, die eben diese emails enthalten.

Das ganze ist jetzt nicht getestet, aber sollte eigentlich funktionieren.


----------



## freichle (21. Juni 2007)

```
1. SELECT *
   2. FROM tabelle
   3. WHERE (vorname,email) IN
   4. SELECT vorname,email
   5. FROM tabelle
   6. GROUP BY vorname,email
   7. HAVING COUNT(*)>1)
```

Super mit dem Beispiel hat das wunderbar geklappt. Allerdings gibt es noch einen Makel an der Abfrage und zwar werden leere Datenfelder (NULL) ignoriert. Kann man da was noch an der Abfrage drehen?


----------

