ACCESS: Nach Dubletten suchen (doppelte Datensätze)

Sind Dubletten bei kleinen Datenbeständen schon kaum von Hand in den Griff zu bekommen, so sind sie bei großen Datenmengen, wie sie von Datenbanken wie ACCESS verwaltet werden, nur noch mit den passenden Hilfsmitteln zu bewältigen.

Grundsätzlich ist bei Dubletten zwischen eindeutigen und unscharfen Dubletten zu unterscheiden. Mehr zum Thema unscharfe Dubletten finden Sie in dem Artikel "Dubletten mit geringen Abweichungen". Eindeutige Dubletten, also doppelte Datensätze bei denen alle Treffer bis auf die Groß-Kleinschreibung Zeichen für Zeichen übereinstimmen, sind mit SQL-Abfragen relativ leicht zu finden. Zwar enthält der Abfrage-Assistent in ACCESS eine Option um eine Abfrage für die Duplikatsuche zu erstellen. Das Ergebnis listet aber lediglich die doppelt vorkommenden Begriffe und die Anzahl wie oft diese in der Tabelle vorkommen auf. Gelöscht werden können die gefundenen Dubletten auf diesem Wege leider nicht. Um eine eigene SQL-Abfrage für diesen Zweck kommt man daher auch in ACCESS nicht herum.

Am einfachsten erstellt man dazu zunächst einen neuen Abfrageentwurf und wechselt dann über den Menüeintrag 'SQL-Ansicht' aus dem Kontextmenü dort oder über das kleine 'SQL'-Symbol ganz unten am rechten Rand des Fensters zur direkten Eingabe von SQL-Befehlen. An dieser Stelle kann man dann, wie bei anderen Datenbankservern auch, direkt SQL-Befehle eingeben. Mithilfe der Schaltfläche 'Ausführen' kann der eingegebene SQL-Befehl ausgeführt werden. Über das kleine 'SQL'-Symbol ganz unten am rechten Rand des Fensters kommt man von hier aus zurück zur dazugehörigen SQL-Abfrage.

Bei der folgenden Abfrage beispielsweise liefert ACCESS alle Datensätze zurück bei denen der Inhalt des Datenfelds 'name' übereinstimmt:

SELECT tab1.id, tab1.name, tab2.id, tab2.name
FROM tablename tab1, tablename tab2
WHERE tab1.name=tab2.name
AND tab1.id<>tab2.id
AND tab1.id=(SELECT MAX(id) FROM tablename tab
WHERE tab.name=tab1.name)

Wie man sieht ist für diese SQL-Abfrage eine Spalte mit einer ID nötig, die den jeweiligen Datensatz eindeutig identifiziert, um sicher zu stellen, dass ein Datensatz nicht mit sich selbst verglichen wird. Darüber hinaus wird diese ID benötigt, um sicher zu stellen, dass der Datensatz mit der größten ID nur in der Spalte 'tab1.id', nicht aber auch in der Spalte 'tab2.id' auftaucht. Auf diese Weise wird sichergestellt, dass der Datensatz mit der größten ID aus einer Dublettengruppe nicht mit gelöscht wird. Die IDs der Datensätze die gelöscht werden sollen stehen in der Spalte 'tab2.id'. In einen DELETE-Befehl für ACCESS eingebaut sieht das Ergebnis dann folgendermaßen aus:

DELETE FROM tablename 
WHERE id IN
(SELECT tab2.id
FROM tablename tab1, tablename tab2
WHERE tab1.name=tab2.name
AND tab1.id<>tab2.id
AND tab1.id=(SELECT MAX(id) FROM tablename tab
WHERE tab.name=tab1.name))

Dieser SQL-Befehl lässt sich natürlich leicht dahingehend erweitern, dass neben dem Inhalt des Datenfelds 'name' auch noch weitere Datenfelder, beispielsweise die Datenfelder die zusammen die postalische Adresse enthalten, mit verglichen werden.

Welche Möglichkeiten SQL für die Suche nach unscharfen Dubletten bietet können Sie in dem Artikel 'Unscharfe Dublettensuche mit SQL' nachlesen. Zufriedenstellend gelöst werden aber kann dieses Problem nur von spezialisierten Tools, die eine fehlertolerante Suche nach doppelten Datensätzen bieten, wie zum Beispiel die DataQualityTools: