PDA

Vollständige Version anzeigen : XP SQL - Doppelte Datensätze löschen


robbi3000
21.03.2004, 17:54
Hallo zusammen,

ich habe in einer Tabelle rund 52000 Datensätze. Darunter befinden sich ca. 20000 Doppelte und Dreifache.

Ich habe nun mit dem Abfrageassistenten zur Duplikatsuche eine entsprechende Abfrage erstellt.

Die Abfrage zeigt mir jetzt zwar wunderbar alle mehrfachen Datensätze an, aber um sie zu löschen muß ich alle manuell löschen.
Das ist bei der Menge eine Arbeit von mehreren Tagen.

Wie kann ich folgenden SQL Code erweitern um die doppelten und dreifachen vollautomatisch zu löschen ?



SELECT klickTel_Export.Name, klickTel_Export.Straße, klickTel_Export.PLZ, klickTel_Export.Vorname, klickTel_Export.Ort
FROM klickTel_Export
WHERE (((klickTel_Export.Name) In (SELECT [Name] FROM [klickTel_Export] As Tmp GROUP BY [Name],[Straße],[PLZ] HAVING Count(*)>1 And [Straße] = [klickTel_Export].[Straße] And [PLZ] = [klickTel_Export].[PLZ])))
ORDER BY klickTel_Export.Name, klickTel_Export.Straße, klickTel_Export.PLZ;



Vielen Dank für Eure Hilfe!

Robbi

J_Eilers
21.03.2004, 18:11
Vielleicht so? Ungetestet!!!

DELETE
klickTel_Export.*
FROM klickTel_Export
WHERE klickTel_Export.Name In
(
SELECT
[Name]
FROM [klickTel_Export] As Tmp
GROUP BY [Name],
[Straße],
[PLZ]
HAVING Count(*)
>1
AND [Straße] = [klickTel_Export].[Straße]
AND [PLZ] = [klickTel_Export].[PLZ]
)

ORDER BY klickTel_Export.Name,
klickTel_Export.Straße,
klickTel_Export.PLZ;

robbi3000
22.03.2004, 11:30
Hallo Jan,
zunächst vielen Dank für die schnelle Antwort.

Im Prinzip funktioniert die Löschabfrage, das Problem was ich jetzt noch habe ist dass die Abfrage ALLE doppelten löscht.
Ich möchte aber einen der doppelten oder mehrfachen behalten und nur den 2. 3. usw. Datensatz löschen.

Ich habe in der Anweisung mal von >1 auf >2 geändert, dann löscht er halt nur den 3. usw. Eigentlich sollte das bei >1 doch auch so sein, aber wie
erwähnt will er dann alle löschen.

Was kann das sein ??

accfan
22.03.2004, 11:53
Hallo robbi 3000,

ich habe auch lange nach einer solchen Möglichkeit gesucht, aber, nach meiner bisherigen Erfahrung, gibt es keine SQL oder VBA Lösung die dir die doppelten löscht aber einen DS beläßt.

Ich helfe mir mit einem Trick, den ich auch hier aus dem Forum habe:

Hierzu erstelle ich in der Datenbankansicht eine Kopie der Tabelle mit den Doppelten DS, kopiere aber nur die Struktur ohne Daten.

In der Entwurfsansicht dieser kopierten Tabelle markiere ich alle Felder die einen doppelten DS definieren und drücke dann die Primärschlüsseltaste.
Auf diese Weise erhälst du einen zusammengesetzten Schlüssel.

Danach erstelle ich eine Anfügeabfrage, mit der ich alle DS der original Tabelle an die kopierte Tabelle anfügen kann.

Wenn ich diese Abfrage nun ausführe, erscheint zuerst eine Meldung "Sie wollen x-Ds anfügen", bestätige dies mit ok.
Danach kommt eine Meldung"Access kann nicht alle DS anfügen wegen Schlüsselverletzung...."
Schalter sind Ja, Nein und Hilfe.
Betätige bitte "Ja".
Access wird nun alle DS in die kopierte Tabelle einfügen, doppelte aber nur einmal.

Bei mir funktioniert es mit allen Access-Versionen.
Versuch es und freu dich wenn es klappt.

Gruß EW

genschman
22.03.2004, 11:58
Hallo,

es geht sehr wohl über eine Kombination aus Abfrage und VBA, wenn ein Primärschlüssel in der fraglichen Tabelle existiert. Dieser kann ja temporär als Autowert erzeugt und hinterher wieder entfernt werden.
Eine DB, die das macht, habe ich mal irgendwo aufgestöbert. Ich hänge sie mal mit an (Sorry Sascha :D :angel: )

Nouba
22.03.2004, 12:29
Weitere Möglichkeiten findest Du in SQL Abfrage n Doubletten bis auf 1 Datensatz löschen (http://www.ms-office-forum.net/forum/showthread.php?s=&threadid=122247).

robbi3000
22.03.2004, 13:24
Hallo genschman,

ich wollte nun mit der DB "duplikate_loeschen.zip" meine überflüssigen Daten löschen.

Nur leider funktioniert das Formular (frmLöschen) in dieser DB bei mir nicht.
Ich habe die beiden Formulare importiert. Er zeigt mir die Tabellen an und nach Auswahl der Tabelle auch die entsprechenden Felder. Wenn ich die 3 Kriterien Felder nun doppelt klicke um sie rechts als Auswahlkriterium zu übernehmen passiert nichts.

Habe eine neue kleine Test DB angelegt und dort ein paar Daten eingetragen. Hier funktioniert das ganze garnicht - es kommt folgende Fehlermeldung:

SIE HABEN ALS EINSTELLUNG DER EREIGNISEIGENSCHAFT DEN AUSDRUCK -
BEIM ÖFFNEN - EINGEGEBEN. DIESER AUSDRUCK HAT EINEN FEHLER VERURSACHT

Jetzt habe ich in der TEST DB keine Verweise gesetzt. In der eigentlichen DB sind ein paar Verweise drin, was vielleicht erklärt, dass ich dort wenigstens das Formular öffenen kann.

Kann es sein dass ich dort noch weitere Verweise setzen muss, damit ich die Tabelle verwenden kann ???


Vielen Dank.

P.S.: Vielen Dank auch für die anderen Antworten - ich hoffe aber das es mit der "duplikate_loeschen.zip" funktioniert. Ist wahrscheinlich dann nicht so kompliziert für mich.

genschman
22.03.2004, 13:36
Hallo,

Voraussetzung ist wie gesagt, dass ein Primärschlüssel existiert. Ansonsten wird die Schaltfläche im Formular "frmLöschen" zum Übernehmen der auf Duplikate zu prüfenden Felder gar nicht angezeigt.
Dann wird also im linken Listenfeld die Tabelle ausgewählt, im Feld daneben ist mindestens 1 Feld anzuklicken, dass auf Duplikate zu prüfen ist, es können aber auch mehrere gewählt werden. Wenn also eine Kombination aus PLZ und Ort geprüft werden soll, müssen beide Felder angeklickt werden.
Dann wird der Button "Duplikate suchen" betätigt. Anschließend erscheint im unteren Teil des Forms eine Liste aller gefundenen Duplikate mit der jweiligen Anzahl und eine neue Schaltfläche "Duplikate löschen" wird eingeblendet. Nach Betätigen derselben werden aus der gewählten Tabelle die DS gelöscht, die im gewählten Feld Duplikate haben, und zwar so, dass ein beliebiger dieser mehrfach vorkommenden Datensätze erhalten bleibt.

robbi3000
22.03.2004, 13:48
Hallo Genschmann,

ich habe, von den Feldern NachName, Vorname, Strasse usw. abgesehen, auch ein Feld ID. Dieses Feld ist der Primärschlüssel und das Feld für den Autowert.

Ich weiß nicht ob das funktioniert weil es eben das Feld mit dem Autowert ist.

Robbi


P.S. Habe gerade probiert das Feld NachName als Primärschlüssel zu definieren, dann kommt beim speichern aber die Fehlermeldung:

Null-Wert in Index oder Primärschlüssel nicht möglich.

genschman
22.03.2004, 13:54
importiere mal Deine Tabelle in die Duplikate_loeschen.mdb. Dann öffne das Formular "frmlöschen". Dort ist dann wie gesagt im linken Listenfeld die bewusste Tabelle zu markieren. Dann ist im Listenfeld rechts daneben das zu prüfende Feld anzuklicken. Sobald mindestens ein Feld angeklickt wurde, erscheint ein Button "Duplikate suchen". dieser ist dann zubetätigen, und wenn welche gefunden werden, erscheint eine 3. Schaltfläche "Duplikate löschen".
Klappt das soweit?

robbi3000
22.03.2004, 14:15
Hallo Genschmann,

so hat es funktioniert.

Mein allerherzlichsten Dank.

Robbi