Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Löschabfrage

Begonnen von Lara, März 31, 2011, 00:30:41

⏪ vorheriges - nächstes ⏩

Lara

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

bahasu

#1
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]
Servus

Lara

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

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

database

#4
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

Lara

#5
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!

database

#6
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.


Lara

Entschuldigung. Dumm gelaufen, das war ein Denkfehler von mir. Eine ID (jetzt verstehe ich erst den Begriff) habe ich nicht.

database

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.  ;)

Lara

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?

database

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

DF6GL

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.

Lara

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

database

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.


Lara

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 ...