Hallo,
mir ist die Vorgehensweise bei einer Löschabfrage von Duplikaten teils noch unklar.
Angenommen, ich habe eine DB-Tabelle namens ABC, auf der sich 50.000 Datensätze befinden, davon sind 2000 doppelt vorhanden und sollen entfernt werden.
Mittels einer Duplikat-Abfrage habe ich eine DB-Tabelle namens DEF gewonnen, die alle 2.000 Duplikate enthält. Nur die doppelten, nicht die Pärchen.
Den gemeinsamen ID nenne ich XY.
Muss ich bei einer Löschabfrage tatsächlich SQL beherrschen (ich tue es nicht) und einen Code in die SQL-Ansicht setzen. Wenn ja, wie müsste der Code denn lauten?
Oder kann ich auch in der Entwurfsansicht der Löschabfrage etwas ... hm, bewirken?
Ratlose Grüße an das Forum von Lara
Moin Lara,
Mit den folgenden Schritten löschst Du die in ABC doppelt vorhandenen Daten:
Im Anhang ein Beispiel. Am besten testest Du die folgenden Schritte zuerst an diesem Beispiel. Dann siehst Du, ob Du so Dein Ziel erreichst und löschst im worst case nicht die falschen Daten.
1. mache eine Sicherungskopie Deiner Datenbank
2. gehe in den Entwurfmodus einer neuen Abfrage
3. wechsele in die sql-Ansicht: im Menü "Ansicht" und dann "SQL-Ansicht" anklicken
4. gebe dort ein: DELETE * FROM tabelle1 WHERE EXISTS(SELECT 'x' FROM tabelle2 WHERE tabelle1.feld = tabelle2.feld);
5. passe diese Anweisung an: statt "tabelle1" und "tabelle2" bitte die Namen Deiner Tabelle und statt "tabelle1.feld" dann "Dein_Tabellenname.Dein_Verknüpfungsfeld". Bei"tabelle2.feld" bitte auch Deinen Tabellennamen und Feldnamen angeben.
In Deinem Beispiel: tabelle1 heißt ABC und Tabelle2 heißt "DEF"
"Feld" ist das Feld, über das die beiden Tabellen miteinander verbunden sind. Bei Dir also "XY"
6. Klick das "!" an bzw. im Menü "Abfrage" den Punkt "Ausführen" und bestätige die nächste Frage
Harald
[Anhang gelöscht durch Administrator]
So, ich probiere es nun zum zweiten Mal aus.
Denn ich bekam eine Parameterabfrage, außerdem bewegte sich der Balken beim Ausführen nicht mehr weiter. ???
Mit 'x' ist gemeinsame ID gemeint?
Dieser Feldname mit oder ohne ' eingeben?
Zwischen EXISTS und (SELECT kein Leerzeichen?
Grüße, Lara
Ok, der zweite Versuch war schon besser.
Allerdings wurde ich gefragt, ob ich 3.458 Zeilen löschen möchte.
Nein, ich möchte doch nur den jeweiligen Zwilling, also 1.729 Datensätze löschen.
Die Tabelle DEF enthält auch nur 1.729 Datensätze.
Danke für Hilfe und Gruß, Lara
Hallo,
die Sicherungskopie hast du ja noch ...
Wenn in der Tabelle DEF wirklich nur die IDs enthalten sind, welche aus der Tabelle ABC zu löschen sind dann so:
SELECT * FROM ABC WHERE ABC.XY IN (SELECT DEF.XY FROM DEF)
Kopiere diesen SQL String in die SQL-Ansicht einer NEUEN Abfrage und führe danach die Abfrage aus.
Wenn du als Ergebnis jene Datensätze bekommst, die tatsächlich zu löschen sind, dann gehe wieder in den Abfrage-Entwurf,
dort in ide SQL Ansicht und ersetze SELECT * einfach durch DELETE.
Also erhältst du folgende SQL:
DELETE * FROM ABC WHERE ABC.XY IN (SELECT DEF.XY FROM DEF)
Führe danach die Abfrage nochmals aus und es werden die doppelten Datensätze gelöscht.
EDIT
LÖSCH-SQL Stern eingefügt...
HTH
Danke!
Habe ich alles genau so gemacht - aber schade!
Mir werden unter select leider wieder 3458 Datensätze angezeigt. :'(
LG von Lara
Edit: Logisch, jetzt verstehe ich endlich den Code :o
In Tabelle ABC ist ja XY jeweils doppelt drin!
Hallo,
In Tabelle ABC ist ja XY jeweils doppelt drin!
Sollt aber nicht sein,
Den gemeinsamen ID nenne ich XY
Hier hätte ich angenommen, dass es sich um den Primärschlüssel handelt und der kann nicht mehrfach in der Tabelle stehen!
EDIT: Nachtrag
Ein Primärschlüssel kennzeichnet einen Datensatzu in der Tabelle eindeutig, kann daher nicht mehrfach vorkommen.
Ich gehe davon aus, dass deine Tabelle mit den Duplikaten einen solchen enthält. Somit finden sich in der Tabelle dann Duplikate,
die aber im Primärschlüssel unterschiedlich sind.
Dieses Feld musst du beim Export in die Duplikatstabelle 'DEF' einschließen.
Bei der Löschabfrage musst du dann statt dem bisherigen XY den PK verwenden!
Das sollte dann schon funktionieren, da es nicht sein kann, dass auf dioese Weise mehr als die exportierten Datensätze gefunden werden.
Entschuldigung. Dumm gelaufen, das war ein Denkfehler von mir. Eine ID (jetzt verstehe ich erst den Begriff) habe ich nicht.
OK, soll keine große Sache sein...
Gehe in den Tabellenentwurf der ABC und füge ein Feld ein, Felddatentyp Autowert, nenne das Feld ID.
Zeige die Tabelle an, du müsstest nun die Datensätze fortlaufend nummeriert sehen.
Führe die Duplikatsabfrage nochmals aus und schließe ID beim Export mit ein.
Dann versuche nochmal die Löschabfrage nach meinem Vorschlag. ;)
Da ich inzwischen mit über 590.000 Datensätzen arbeiten muss, ist ein nachträgliches ID-Feld nicht möglich:
Anzahl der Dateisperrungen überschritten. Fehler 3052.
Ist wohl eine MS-DOS-Geschichte?
Hi,
das klingt nicht gut... Hmmmmm....
du könntest eine Kopie deiner Tabelle (nur die Struktur) erstellen und in die Kopie das Autowertfeld hinzufügen.
Danach übernimmst du alle Datensätze mittels Anfügeabfrage - so sollte es möglich sein die 590.000 Datensätze zu mummerieren
Versuch das mal
Hallo,
vielleicht hilft dieses zunächst:
In der Registry unter
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Jet 4.0
einen (viel) höheren Wert eintragen
oder mit
SetOption dbMaxLocksPerFile, 500000
temporär den Wert erhöhen.
Habe ich gemacht.
In Kopie Feldname ID eingefügt, weiter Felddatentyp AutoWert (Long Integer, Inkrement, Ja (ohne Duplikate).
Der Kopie habe ich per Anfügeabfrage (?? - mache ich heute auch zum ersten Mal) die Originalabfrage angefügt.
Was ist mit "Abfrage benötigt Zielfeld" gemeint?
LG Lara
p.a.: An der Registry ändere ich erst etwas, wenn dieser Versuch (siehe oben ) misslingt
OK,
also du erstellst eine ganz normale Auswahlabfrage auf die Originaltabelle und stellst sicher, dass ALLE Felder der Originaltabelle in der Abfrage enthalten sind.
Dann wählst du den Abfragetyp 'Anfügeabfrage' aus und gibst die Tabellenkopie als Zieltabelle an.
Dabei muss in der Zeile 'Anfügen an jeweils der gleiche Feldname der Originaltabelle stehen
Führe die Abfrage jetzt aus - sollte laufen.
Habe es genauso gemacht!
Im Fenster 'Anfügen an ....' habe ich den Namen der Tabellenkopie angeklickt.
Das ist die Tab mit der kopierten Struktur und zugefügtem Feld ID.
Die Zeilen 'Anfügen an ...' sind in der Entwurfsansicht alle mit dem Feldnamen der Originaltab ausgefüllt.
Aber es wurde die Tab-Kopie nicht angefügt.
Denn die Datenblattansicht zeigt Inhalte der Originalkopie, aber ohne fortlfd ID-Nr.
??? Ich fürchte, ich bin nicht sonderlich talentiert ...
Stopp.
Ausführen bedeutet ja *rotes Ausrufezeichen* ;D
Mir wird angezeigt, wieviel Datensätze angefügt werden sollen (591.765 Stck)
Die Anzahl ist scheinbar aber nicht die richtige.
Differenz zur Originaldatei (596.912 Stck) ist in etwa das dreifache der Duplikate (5.147 Stck)
Nein, es hat nichts mit den Duplikaten zu tun. :D
Bei Bestätigung von "Ja" kam Meldung, dass MS Access wegen Gültigkeitsverletzung 36.670 Datensätze nicht anfügen kann.
Ich gehe jetzt die Registry ändern .... >:(
edit: .... was übrigens nichts gebracht hat
Das ganze Prozedere nochmals gemacht, indem ich mir von der Sicherungs-DB die vollständige Originaltabelle rüberkopiert habe. Kopie mit ID angelegt, diesmal 'mit Duplikate' gelassen.
Anfügeabfrage ausgeführt, jawohl!! 596.912 Datensätze werden übertragen.
Schade, danach kam Fehlermeldung: 41.815 DS wegen Gültigkeitsverletzungen nicht an Tabelle angefügt.
Schönen Abend noch, Lara
Hallo,
ZitatKopie mit ID angelegt, diesmal 'mit Duplikate' gelassen
KEINE DUPLIKATE!!!!!
Zitatwegen Gültigkeitsverletzungen nicht an Tabelle angefügt
also gibt es in der Tabelle Daten, die in die Kopie nicht eingefügt werden können weil ...
Nachdem wir hier diese Daten aber nicht sehen, wirst du selbst versuchen müssen herauszufinden, was mit diesen Datensätzen nicht in Ordnung ist.
Eventuell ist ein Feld ohne Inhalt und in der Zieltabelle darf ein solches nicht eingefügt werden (Null-Wert nicht erlaubt)?
Kannst du denn nicht eine neue DB erstellen mit der Tabelle und 10 oder 15 Datensätze - gültige, ungültige sowie Duplikate - reinkopieren und das Ding dann hier hochladen?
Ja, ich weiß ja jetzt .... keine Duplikate.
Aber immerhin werden mir doch mit der zweiten Variante meine gesamten 596.912 Datensätze in die Zieltabelle übertragen. Da bin ich doch schon mal auf der sichern Seite.
Mit der ersten Variante fehlen mir ja sonst 5.147 Datensätze. Warum und welche weiß ich ja nicht.
Werde ich die Gründe der Gültigkeitsverletzung finden, so kann ich ja die Löschabfrage mit Hilfe meiner Duplikate aus der Duplikatsabfrage endlich starten.
Nächster Plan für morgen: werde die Felddatentypen usw genau vergleichen.
Andere Gründe für Gültigkeitsverletzungen kann ich mir grad nicht vorstellen.
Viele Grüße, Lara
Hallo Lara,
ZitatAndere Gründe für Gültigkeitsverletzungen kann ich mir grad nicht vorstellen
Naja, wenn du eine KOPIE der Originaltabelle gemacht hast, sollten auch die Felddatentypen stimmen.
Hat Access denn keine Fehlertabelle erzeugt?
Nein, es wurde keine Fehlertabelle erstellt.
Genau, bei der Zieltabelle handelt es sich um die Kopie des Originals. Lediglich die Spalte ID (Auto-Wert) wurde vorangestellt.
OK, nun gut,
ZitatAber immerhin werden mir doch mit der zweiten Variante meine gesamten 596.912 Datensätze in die Zieltabelle übertragen
Hast du nun alle Daten in der Zieltabelle?
Ist das ID-Feld nun auch fortlaufend nummeriert?
wenn ja dann lass mal die Duplikatssuche laufen und exportiere die ID der Duplikate in eine neue Tabelle
anschließen überprüfst du mit der folgenden SQL (Namen mußt du natürlich anpassen) ob die Duplikate nun gefunden werden
SELECT * FROM ABC WHERE ABC.ID IN (SELECT DEF.ID FROM DEF)
und wenn das passt dan lösche mal mit dieser SQL ... ebenfalls Namen anzupassen!
DELETE * FROM ABC WHERE ABC.ID IN (SELECT DEF.ID FROM DEF)
NICHT VERGESSEN - ZUERST IMMER AN EINER KOPIE DER ORIGINALDATENBANK TESTEN!!!!