Michael Schröpl: Doppelte löschen als SQL-Statement

Beitrag lesen

Hi,

Wie kann ich unter Access mit einer SQL-Abfrage doppelte Tupel löschen also Mehrfacheintragungen.
Wenn Email doppelt ist, dann bitte komplett die Zeile löschen.

Welche Zeile löschen? (Das ist das Problem bei der Sache.)
Nehmen wir an, Du hast zwei Zeilen mit Name1 und Name2, aber identischer Mail-Adresse. Möchtest Du jetzt Name1, Name2 oder beide löschen?

SQL "denkt" mengenwertig, nicht sequentiell - das alleine wird Dein Vorgehen schon nicht ganz trivial werden lassen.
Ginge es um identische Duplikate, also Zeilen, die in allen Spalten übereinstimmen, dann würde ich folgendes Vorgehensweise verwenden:

1. Mehrdeutigkeit aller Adressen berechnen:
CREATE TABLE tmp1 AS SELECT mailadr, COUNT (*) anzahl FROM tablename GROUP BY mailadr;

2. Nun die eindeutigen wegwerfen (es geht auch anders, ist so aber verständlicher):
DELETE FROM tmp1 WHERE anzahl = 1;

3. Von den mehrdeutigen jeweils *genau ein* Exemplar sichern:
CREATE TABLE tmp2 AS SELECT DISTINCT * from tablename WHERE mailadr IN (SELECT mailadr FROM tmp1);

4. Jetzt alle mehrdeutigen Kandidaten löschen:
DELETE FROM tablename WHERE mailadr in (SELECT mailadr FROM tmp1);

5. Und nun die eindeutigen Adressen zurückkopieren:
INSERT INTO tablename SELECT * FROM tmp2;

Was für ein Aufwand!

Deshalb ist die bessere Lösung diejenige, eine solche Situation gar nicht erst aufkommen zu lassen, indem Du für das Feld "mailadr" eine CONSTRAINT definierst, welche mehrdeutige Werte gar nicht erst erlaubt (dann wird bereits das INSERT einer solchen Zeile zurückgewiesen).
Wie das genau in Access geht, weiß ich nicht - zur Not hilft es, einen UNIQUE INDEX über diese Spalte zu legen, was dieselbe Wirkung hat.

mfG - Michael