Access, Duplikate in Tabellen

Wer hat eine (oder mehrere, oder eine geschachtelte) fertige Abfrage, die aus einer Tabelle die Duplikate löscht bzw. welche die Datensätze der Tabelle ohne Duplikate in eine neue Tabelle schreibt.

Ich möchte das Rad nicht wieder neu erfinden!

Danke
Harald

Ich denke, mit einer Abfrage ist das nicht getan - was ist denn ein Duplikat? Meistens sind doch nur einzelne Felder identisch bzw. vielleicht nur ähnlich - und in anderen stehen unterschiedliche Daten. Da gibt es dann keine fertige Lösung, welchen der duplizierten Datensätze man löscht bzw. in eine andere Tabelle transferiert.

Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ich denke, mit einer Abfrage ist das
nicht getan - was ist denn ein
Duplikat? Meistens sind doch nur einzelne
Felder identisch bzw. vielleicht nur
ähnlich - und in anderen stehen
unterschiedliche Daten. Da gibt es dann
keine fertige Lösung, welchen der
duplizierten Datensätze man löscht bzw.
in eine andere Tabelle transferiert.

Reinhard

Ja, ja, ich weiß, ich hätte mich genauer ausdrücken müssen. Ich will natürlich einige Felder aus einer Tabelle aussuchen können und diese dann auf Gleichheit prüfen. Sind dann zwei Datensätze gleich, ist es egal welcher der Datensätze gelöscht beziehungsweise welcher in eine neue Tabelle exportiert wird.

Für die Festlegung der Tabelle und der relevanten Felder, sowie für die Festlegung eines neuen Tabellennamens würde ich ein Formular entwerfen, in dem ich dann die SQL-Abfrage dynamisch erstelle.

Für die Abfrage habe ich auch schon eine Vorstellung, wie man das machen könnte. Z. B. mit den beiden Abfrage-Assistenten zur Duplikatensuche und zur Inkonsistenzsuche und dann noch die Dupletten grupieren und aus allen Abfragen eine neue Tabelle zusammenbasteln. Die Abfrage-Assistenten liefern ja schöne Beispiele, die man kopieren und erweitern kann.

Aber ich dachte, es gibt vielleicht jemanden, der sowas schon mal gemacht hat und ich nicht von Null anfangen müsste.

Gruß
Harald

Ja, ja, ich weiß, ich hätte mich genauer
ausdrücken müssen. Ich will natürlich
einige Felder aus einer Tabelle aussuchen
können und diese dann auf Gleichheit
prüfen. Sind dann zwei Datensätze gleich,
ist es egal welcher der Datensätze
gelöscht beziehungsweise welcher in eine
neue Tabelle exportiert wird.

Für die Festlegung der Tabelle und der
relevanten Felder, sowie für die
Festlegung eines neuen Tabellennamens
würde ich ein Formular entwerfen, in dem
ich dann die SQL-Abfrage dynamisch
erstelle.

Für die Abfrage habe ich auch schon eine
Vorstellung, wie man das machen könnte.
Z. B. mit den beiden Abfrage-Assistenten
zur Duplikatensuche und zur
Inkonsistenzsuche und dann noch die
Dupletten grupieren und aus allen
Abfragen eine neue Tabelle
zusammenbasteln. Die Abfrage-Assistenten
liefern ja schöne Beispiele, die man
kopieren und erweitern kann.

Aber ich dachte, es gibt vielleicht
jemanden, der sowas schon mal gemacht hat
und ich nicht von Null anfangen müsste.

Ich hab so etwas schon hundertmal gemacht - aber es sind halt immer wieder Speziallösungen mit irgendwelchen zusätzlichen Heuristiken…

Ich sehe auch nicht, wie man das mit einer einzelnen Abfrage hinbekommen sollte. Man müsste m.E. in 3 Schritten vorgehen.

  1. Die Duplikate markieren (mit einer Duplikat-Such-Abfrage in einem temporären Ja/Nein-Feld in der Tabelle)
  2. Die Markierung für die Datensätze, die nicht gelöscht werden sollen, wieder entfernen (mit einer Abfrage, die die Duplikate über die duplizierten Felder gruppiert).
  3. Die Datensätze mit verbleibender Markierung löschen (mit einer Löschabfrage).

Oder das ganze gleich per Code machen - ist leichter zu durchschauen und zu debuggen…

Reinhard

Es gibt einen Abfrageassistenten für Duplikatssuche.

Es gibt einen Abfrageassistenten für
Duplikatssuche.

Tja - so weit waren wir schon. Die Duplikatsuche findet ja nur die Duplikate. Wenn man daraus eine Löschabfrage macht, werden alle duplizierten Datensätze gelöscht, was natürlich nicht weiterhilft. Die Frage ist halt, wie man alle bis auf einen löscht…

Reinhard

Ich hab so etwas schon hundertmal gemacht

  • aber es sind halt immer wieder
    Speziallösungen mit irgendwelchen
    zusätzlichen Heuristiken…

Warum hast Du das nicht einmal etwas universeller gemacht? Dann könntest Du immer wieder darauf zurückgreifen.

Ich sehe auch nicht, wie man das mit
einer einzelnen Abfrage hinbekommen
sollte. Man müsste m.E. in 3 Schritten
vorgehen.

Das denke ich auch.

Oder das ganze gleich per Code machen -
ist leichter zu durchschauen und zu
debuggen…

Ich denke man sollte Access die Arbeit machen lassen (mittels SQL), schon alleine deshalb weil es schneller geht.

Harald

Warum hast Du das nicht einmal etwas
universeller gemacht? Dann könntest Du
immer wieder darauf zurückgreifen.

Tja, wenn es ginge, hätte ich es sicher gemacht. Aber eine Heuristik, die geeignet ist, Duplikate in Firmennamen zu entdecken, taugt leider nichts, wenn es um Personennamen geht. Und Duplikate in Adressen sind etwas anderes als Duplikate in Rechnungen. Wiederverwendbarkeit ist in diesem Bereich identisch mit Trivialität - man bekommt dann halt so etwas wie Microsofts Assistenten zur Duplikatsuche - also etwas, das man getrost vergessen kann…

Ich denke man sollte Access die Arbeit
machen lassen (mittels SQL), schon
alleine deshalb weil es schneller geht.

Nicht unbedingt. Komplexe Heuristiken sind eh in Code angelegt - ausserdem, was hilft’s, wenn man blitzschnell die falschen Daten weglöscht…

Reinhard

Die Frage
ist halt, wie man alle bis auf einen
löscht…

Ganz einfach:
Ich mache eine Löschabfrage, die auf diese Duplikats-Abfrage zugreift

Ganz einfach:
Ich mache eine Löschabfrage, die auf
diese Duplikats-Abfrage zugreift

Die löscht dann doch alle mehrfach vorkommenden Datensätze und nicht nur die Duplikate.

Reinhard

1.Abfrage: [Adressen]
Gruppierung [Nachname]
Anzahl [Nachname] >1
xxx: Ersterwert [KundenNummer]

2.Lösch-Abfrage:
Verknüpfe [Adressen].[KundenNummer] - [1.Abfrage].[xxx]
Löschen von [Adressen].*

so müßte es IMHO gehen

Nun ja, zum einen ist das ja nicht das Ergebnis des Duplikat-Suche-Assistenten…

Zum anderen müßte es wohl so aussehen:

  1. Abfrage (MeineTabelle_Duplikate):

SELECT DISTINCTROW First(MeineTabelle.ID) AS ID
FROM MeineTabelle
GROUP BY MeineTabelle.Nachname
HAVING (((Count(MeineTabelle.Nachname))>1))
ORDER BY Count(MeineTabelle.Nachname);

  1. Abfrage (MeineTabelle_Löschen)
    DELETE MeineTabelle.*
    FROM MeineTabelle_Duplikate INNER JOIN MeineTabelle ON MeineTabelle_Duplikate.ID = MeineTabelle.ID;

Zum dritten liefert die Abfrage dann aber leider die Fehlermeldung „Operation muss eine aktualisierbare Abfrage verwenden“. Aber vielleicht mach ich ja etwas falsch…

Reinhard

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Harry!
machs doch so:
Laß den Kunden die Duplikatfelder per Formular aussuchen.
Jetzt die Lösung:
Kopier die komplette Originaltabelle ohne Daten (also nur Struktur) in eine temporäre Tabelle. Anschließend setzt die einen zusammengesetzten primary Index auf die gewählten Felder. Temporäre Tabelle Speichern!
Jetzt erstellt Du eine normale Anfügeabfrage von der Originaltabelle in die temporäre Tabelle! Dabei fügt Access aufgrund des Indexes nur den jeweils ersten Datensatz aus der Originaltabelle an. Alle weiteren Duplikate werden automatisch entfernt.
Gruß von Deinem Bruder

OT: hm…stimmt, weiß auch nicht
OT

Falls es noch jemand interessiert.

Nachdem ich das Problem neulich für mich lösen mußte, habe ich aus obiger Löschabfrage eine Aktualisierungsabfrage gemacht, die bei den zu löschenden Sätzen z.B. in [Adresse] eingetrage: „Ich möchte gelöscht werden“
Darauf kann dann eine Löschabfrage gemacht werden, die diese Sätze löscht.
Falls die Aufgabe öfters vorkommt, könnte man ein Ja/Nein Feld in die Tabellenstruktur aufnehmen…