Duplikate in Access Tabellen löschen

Duplikate in Access Tabellen löschen

Trotz aller Sorgfalt passiert es auch in professionell angelegten Datenbanken immer wieder, dass Datensätze doppelt eingetragen werden. In Microsoft Access gibt es schon lange die Möglichkeit, diese doppelten Datensätze ganz bequem über den Abfrage-Assistenten zur Duplikatsuche aufzuspüren. Was aber muss ich tun, um die überzähligen Einträge aus meiner Datenbank zu löschen? Genau das zeigen wir Ihnen in diesem Beitrag.

Hinweis:

Das Beispiel dient zur Verdeutlichung der Vorgehensweise. Am Ende des Beitrags finden Sie eine Erklärung, was Sie tun müssen, um die hier vorgestellte Lösung auf eine Access Tabelle in Ihrer Datenbank anzuwenden.

WICHTIG!

Arbeiten Sie NIE an Ihren Originaldaten. Erstellen Sie sich zu Testzwecken immer eine Sicherheitskopie der Tabelle. Hierzu schließen Sie zuerst die Tabelle, falls sie geöffnet ist. Wählen Sie die Tabelle nun im Navigationsbereich per Rechtsklick aus und kopieren Sie sie. Klicken Sie nun nochmals mit der rechten Maustaste in den Navigationsbereich und wählen Sie den Eintrag Einfügen. Es erscheint ein Dialogfenster, welches Sie mit OK bestätigen. Vorher können Sie bei Bedarf den Namen der Sicherheitskopie Ihrer Tabelle ändern. Achten Sie besonders darauf, dass die Einstellung Struktur und Daten ausgewählt ist.

Kopie einer Tabelle erstellen

Kopie einer Tabelle erstellen

 

Die Beispieltabelle

Um den Lösungsweg zu verdeutlichen, verwenden wir eine einfache Access-Tabelle.

Die Beispieltabelle

Die Beispieltabelle

In dieser Tabelle ist die Kundennummer der Primärschlüssel. Allerdings haben sich hier einige Kunden mehrfach eingeschlichen. Die Angaben zu den Kundennummern 1 und 11252, 2 und 8968, 3 und 15067 sowie 2169 und 2297 sind identisch.

Duplikate finden

Mit Hilfe des Abfrage-Assistenten zur Duplikatsuche kann man diese doppelten Datensätze recht einfach ermitteln.

Hierzu wählen Sie im Register Erstellen die Schaltfläche Abfrage-Assistent.

Den Abfrageassistenten starten

Den Abfrageassistenten starten

Im Dialogfenster Neue Abfrage wählen Sie den Eintrag Abfrage-Assistent zur Duplikatsuche.

Schritt 1 im Abfrageassistenten

Schritt 1 im Abfrageassistenten

Die Basis für unsere Duplikatsuche ist die Tabelle tbl_Kunden.

Schritt 2 im Abfrageassistenten

Schritt 2 im Abfrageassistenten

Wir gehen bei der Abfrage davon aus, dass es sich bei allen Datensätzen, bei denen die Felder KundeVorname, KundeName und KundeGebDat identisch sind, um Duplikate handelt. Also fügen wir diese Felder in unsere Abfrage ein.

Schritt 3 im Abfrageassistenten

Schritt 3 im Abfrageassistenten

Im nächsten Fenster können wir noch zusätzliche Felder auswählen, die im Abfrageergebnis angezeigt werden sollen. Diese Felder werden nicht zur Ermittlung der Duplikate herangezogen. Wir wählen hier das Feld Kundennummer aus.

Schritt 4 im Abfrageassitenten

Schritt 4 im Abfrageassistenten

Im letzten Schritt des Assistenten vergeben Sie einen Namen für die Abfrage (hier qry_Duplikate_tbl_Kunden).

Schritt 5 im Abfrageassistenten

Schritt 5 im Abfrageassistenten

Nachdem Sie auf Fertigstellen geklickt haben, sollte folgendes Ergebnis angezeigt werden:

Die Duplikate

Die Duplikate

In der Entwurfsansicht der Abfrage findet sich in der Kriterienzeile ein Eintrag, der in dieser Ansicht allerdings schlecht zu lesen ist.

Entwurfsansicht der Duplikatsuche

Entwurfsansicht der Duplikatsuche

Wechseln Sie über die Schaltfläche Ansicht in die SQL-Ansicht der Abfrage.

Wechsel zur SQL-Ansicht

Wechsel zur SQL-Ansicht

Sie sehen nun das SQL-Statement zu Ihrer Abfrage.

SELECT tbl_Kunden.[KundeVorname], tbl_Kunden.[KundeName], tbl_Kunden.[KundeGebDat], tbl_Kunden.[Kundennummer]
FROM tbl_Kunden</em>
WHERE (((tbl_Kunden.[KundeVorname]) In (SELECT [KundeVorname] FROM [tbl_Kunden] As Tmp GROUP BY [KundeVorname],[KundeName],[KundeGebDat] HAVING Count(*)>1 And [KundeName] = [tbl_Kunden].[KundeName] And [KundeGebDat] = [tbl_Kunden].[KundeGebDat])))
ORDER BY tbl_Kunden.[KundeVorname], tbl_Kunden.[KundeName], tbl_Kunden.[KundeGebDat];

Ohne ins Detail zu gehen, hier eine kurze Erläuterung:

Die SELECT-Anweisung legt fest, welche Felder verwendet werden. Die FROM-Anweisung besagt, welche Tabelle der Abfrage zugrunde liegt. In der WHERE-Klausel werden die Kriterien für die Abfrage festgelegt und die abschließende ORDER BY-Zeile legt die Sortierung der Abfrage fest.

Duplikate vereinzeln

Jetzt fehlen nur noch die letzten Schritte, um die überzähligen Datensätze zu löschen. Hierzu benötigen wir ein weiteres SQL-Statement:

IN (SELECT Min(tbl_Kunden.Kundennummer) AS MinVonKundennummer FROM tbl_Kunden GROUP BY tbl_Kunden.KundeVorname, tbl_Kunden.KundeName, tbl_Kunden.KundeGebDat HAVING (((Count(tbl_Kunden.KundeVorname))>1) AND ((Count(tbl_Kunden.KundeName))>1) AND ((Count(tbl_Kunden.KundeGebDat))>1)))

Kopieren Sie einfach den Text und fügen diesen in die Kriterienzeile der Kundennummer ein.

Entwurfsansicht mit zusätzlichem SQL-Code

Entwurfsansicht mit zusätzlichem SQL-Code

Wenn Sie nun in die Datenblattansicht wechseln, erscheint dort tatsächlich nur noch ein Eintrag für jedes Duplikat.

Vereinzelte Duplikate

Vereinzelte Duplikate

Löschabfrage erstellen

Wenn bis hierhin alles funktioniert hat, bleibt nur noch eine Änderung, die an der Abfrage gemacht werden muss.

In diesem letzten Schritt müssen Sie die Abfrage in eine Löschabfrage umwandeln. Hierzu öffnen Sie die Abfrage in der Entwurfsansicht und klicken im Register Entwurf der Abfragetools auf die Schaltfläche Löschen.

Abfrae in Löschabfrage umwandeln

Abfrage in Löschabfrage umwandeln

Speichern Sie die Abfrage und führen Sie sie über die Schaltfläche Ausführen aus. Als Resultat erhalten Sie diese Meldung:

Meldung nach ausführen der Löschabfrage

Meldung nach dem Ausführen der Löschabfrage

Wenn diese Meldung mit OK bestätigt wird, werden die vorher angezeigten Datensätze gelöscht.

Hinweis

In diesem Beispiel wurde davon ausgegangen, dass es zu jedem Datensatz maximal ein Duplikat gibt. Sollten in Ihrer Datenbank mehrere Duplikate zu einem Datensatz vorhanden sein, führen Sie die Löschabfrage einfach so oft aus, bis die Meldung besagt, dass Sie 0 Zeilen aus der Tabelle löschen werden.

Löschabfrage auf eigene Tabelle anpassen

Bis zum Abschnitt Duplikate finden brauchen Sie keine Änderungen vorzunehmen, da hier alles vom Assistenten zur Duplikatsuche erstellt wird. Änderungen sind erst beim SQL-Statement im Abschnitt Duplikate vereinzeln nötig.

Hier noch einmal das SQL-Statement, etwas übersichtlicher dargestellt:

IN (SELECT Min(tbl_Kunden.Kundennummer)

AS MinVonKundennummer FROM tbl_Kunden

GROUP BY tbl_Kunden.KundeVorname, tbl_Kunden.KundeName, tbl_Kunden.KundeGebDat HAVING (((Count(tbl_Kunden.KundeVorname))>1)

AND ((Count(tbl_Kunden.KundeName))>1)

AND ((Count(tbl_Kunden.KundeGebDat))>1)))

Wie deutlich zu erkennen ist, handelt es sich bei den rot markierten Einträgen um den Namen der verwendeten Tabelle. Die grünen Begriffe stellen die verwendeten Felder für die Duplikatsuche dar.

Um die Abfrage auf Ihre Tabelle anzupassen, ersetzen Sie den hier verwendeten roten Tabellennamen durch den Namen Ihrer Tabelle. Ebenso verfahren Sie mit den grünen Feldnamen.

Achten Sie unbedingt darauf, dass Sie

  • keine Klammern oder Punkte löschen
  • die exakte Schreibweise des Tabellennamens und der Feldnamen verwenden

In dem Beispiel wurde jeweils das Duplikat mit der niedrigeren Kundennummer gelöscht. Dies wird durch die Funktion Min in der ersten Zeile des SQL-Textes erreicht. Möchten Sie, dass die Duplikate mit der höheren Kundennummer gelöscht werden, so ersetzen Sie einfach den Begriff Min durch den Begriff Max.

Die zweite Zeile des SQL-Statements legt ein sog. Alias für Ihre Tabelle an. Der Begriff MinVonKundennummer ist hier unwesentlich. Hier kann ein beliebiger Name gewählt werden – unabhängig davon, ob Sie die Funktion Max oder Min verwenden.

 

Training

Versäumen Sie nicht die Access Schulungen der INCAS Training: Wir empfehlen die Access 2010 Grundlagen Schulung oder die Access 2013 Grundlagen Schulung!

Bildnachweis: Titelbild: © iava777 – Fotolia.com 

 

Comments are closed.

Kategorien

Archiv