Access-o-Mania

Access-Forum (Deutsch/German) => Tabelle/Abfrage => Thema gestartet von: Lara am März 31, 2011, 00:30:41

Titel: Löschabfrage
Beitrag von: Lara am März 31, 2011, 00:30:41
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
Titel: Re: Löschabfrage
Beitrag von: bahasu am März 31, 2011, 06:06:35
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]
Titel: Re: Löschabfrage
Beitrag von: Lara am März 31, 2011, 10:07:17
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
Titel: Re: Löschabfrage
Beitrag von: Lara am März 31, 2011, 10:15:26
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
Titel: Re: Löschabfrage
Beitrag von: database am März 31, 2011, 12:38:18
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
Titel: Re: Löschabfrage
Beitrag von: Lara am März 31, 2011, 13:42:59
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!
Titel: Re: Löschabfrage
Beitrag von: database am März 31, 2011, 14:00:19
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.

Titel: Re: Löschabfrage
Beitrag von: Lara am März 31, 2011, 14:17:01
Entschuldigung. Dumm gelaufen, das war ein Denkfehler von mir. Eine ID (jetzt verstehe ich erst den Begriff) habe ich nicht.
Titel: Re: Löschabfrage
Beitrag von: database am März 31, 2011, 14:21:20
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.  ;)
Titel: Re: Löschabfrage
Beitrag von: Lara am März 31, 2011, 14:38:24
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?
Titel: Re: Löschabfrage
Beitrag von: database am März 31, 2011, 14:51:13
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
Titel: Re: Löschabfrage
Beitrag von: DF6GL am März 31, 2011, 15:24:47
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.
Titel: Re: Löschabfrage
Beitrag von: Lara am März 31, 2011, 15:30:34
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
Titel: Re: Löschabfrage
Beitrag von: database am März 31, 2011, 15:37:37
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.

Titel: Re: Löschabfrage
Beitrag von: Lara am März 31, 2011, 15:59:01
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 ...
Titel: Re: Löschabfrage
Beitrag von: Lara am März 31, 2011, 16:14:52
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)

Titel: Re: Löschabfrage
Beitrag von: Lara am März 31, 2011, 16:23:57
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
Titel: Re: Löschabfrage
Beitrag von: Lara am März 31, 2011, 17:10:36
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
Titel: Re: Löschabfrage
Beitrag von: database am April 01, 2011, 14:30:01
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?
Titel: Re: Löschabfrage
Beitrag von: Lara am April 04, 2011, 00:06:40
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
Titel: Re: Löschabfrage
Beitrag von: database am April 04, 2011, 06:09:47
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?

Titel: Re: Löschabfrage
Beitrag von: Lara am April 04, 2011, 14:07:45
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.
Titel: Re: Löschabfrage
Beitrag von: database am April 04, 2011, 14:48:45
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!!!!