SQL Duplikate finden

Registriert
Juli 2017
Beiträge
4
Hallo,

ich habe eine Tabelle mit 2 Spalten (Name, Codezahl) und möchte jetzt alle Codezahl-Duplikate, die jedoch nicht den selben namen haben.

Bsp:
Name || Codezahl
Mark || 88559
Susi || 88559
Willi || 45467
Willi || 45467
Oliver || 54646

Er soll mir hier in dem Beispiel nur den "Mark" und die "Susi" anzeigen, da diese beide die gleiche Codezahlhaben. Willi wiederum nicht, da es sich um dieselbe Person handelt.
Code:
SELECT  Test.Name, Test.Codezahl
FROM Test
WHERE (((Test.Codezahl) In (SELECT [Codezahl] FROM [Test] As Tmp GROUP BY [Codezahl]  HAVING Count(*)>1 )))
ORDER BY Test.Codezahl;

Mein bisherige SQL Anweisung(s.o) gibt mir zur zeit alle Duplikate, also auch den "Willi"
Ich bekomme es irgendwie nicht hin noch eine zusätzliche Anweisung alla " AND Test.Name != Name"

Über Hilfe wäre ich dankbar.

danke
 
Zuletzt bearbeitet:
select "DISTINCT"


damit solltest du keine dups mehr selektieren
 
Ok das hatte ich vorhin schon probiert hat mir aber nicht das gewünschte Ergebnis angezeigt. Aber ich merke gerade, dass es bei einer Testdatenbank (online zum rumprobieren) funktioniert.
Naja ich nutze gerade Access. Liegt wahrscheinlich daran. Ich muss mal schauen.

Danke schön
 
Code:
SELECT t1.Name, t1.Codezahl
FROM Test AS t1 INNER JOIN Test AS t2
ON t1.Codezahl = t2.Codezahl
WHERE t1.Name <> t2.Name;
 
L8N schrieb:
Code:
SELECT t1.Name, t1.Codezahl
FROM Test AS t1 INNER JOIN Test AS t2
ON t1.Codezahl = t2.Codezahl
WHERE t1.Name <> t2.Name;

Access möchte irgendeine Parameter Eingabe. Ich wollte eigentlich nur "schnell" was machen und mir nicht extra eine ordentliche DB runterladen. Access ist nicht wirklich so das wahre. Ich wechsel mal die DB und probiers noch einmal.

Danke
 
Zum schnellen Testen würd' ich Dir SQLite empfehlen. Das ist eine In-Memory Datenbank, die in einer einzigen Datei gespeichert wird.
 
SELECT Test.Name, Test.Codezahl
FROM Test
WHERE (((Test.Codezahl) In (SELECT [Codezahl] FROM [Test] As Tmp GROUP BY [Codezahl] HAVING Min(Name)!=Max(Name) And Count(*) > 1)))
ORDER BY Test.Codezahl;

habs nicht getestet:)
 
umask007 schrieb:
SELECT Test.Name, Test.Codezahl
FROM Test
WHERE (((Test.Codezahl) In (SELECT [Codezahl] FROM [Test] As Tmp GROUP BY [Codezahl] HAVING Min(Name)!=Max(Name) And Count(*) > 1)))
ORDER BY Test.Codezahl;

habs nicht getestet:)

Volltreffer. Das DISTINCT muss halt noch dazu.

Bei der SQL Anweisung mit dem INNER JOIN habe ich Null Datensätze zurückbekommen.

Naja auf jeden Fall vielen Dank.
 
pfennigfuchser schrieb:
Bei der SQL Anweisung mit dem INNER JOIN habe ich Null Datensätze zurückbekommen.
Vorschlag in #4 ist die optimale Lösung, vermutlich hast du nur irgendwo einen kleinen Fehler in deiner Abfrage.
Je nachdem wie groß deine Tabelle ist, solltest du diesen Weg also doch noch bevorzugen.

Denn das Vorgehen in #7 funktioniert zwar ebenfalls, hat jedoch gleich mehrere Nachteile.
Es ist schwer lesbar und durch die Verwendung von Funktionen (wie min, max, count) kann auch kein Index verwendet werden und ist deshalb viel langsamer und benötigt mehr Ressourcen.
 
Zurück
Oben