Löschabfrage

Hallo liebe Wissenden,

ich möchte gerne zwei Access-Tabellen miteinander vergleichen, bzw. eine Löschabfrage erstellen, welche mir aus Tabelle1 die Datensätze rausschmeisst wenn in Tabelle2 das Feld KD_NR identisch ist.
Leider weiss ich nicht wie ich Access 2000 beibringe in welcher Tabelle es löschen soll. =(
Wer weiss mehr?

LG + Danke
Newwonder

Hallo Newwonder

Erstelle eine neue Abfrage in der Entwurfsansicht und wechsle in die SQL-Ansicht.
Gib dort folgendes ein:

DELETE
FROM tabelle\_1 t1
WHERE EXISTS(
 SELECT 'x'
 FROM tabelle\_2 t2
 WHERE t1.feld1 = t2.feld2
)

Natürlich mit deinen Tabellen- und Feldnamen.
Vor dem Löschen Datensicherung nicht vergessen!

Gruss: Christian

Hallo Christian,

danke für die Antwort, allerdings ist die Eindeutigkeit anscheinend noch nicht gegeben. Wie sieht die SQL-Anweisung denn aus, wenn ich erst 2 übereinstimmende Kriterien püfe um den Datensatz zu löschen?
Evtl. so in der Art?

DELETE
FROM tabelle\_1 t1 t3
WHERE EXISTS(
 SELECT 'x'
 FROM tabelle\_2 t2 t4
 WHERE t1.feld1 = t2.feld2
 AND
 WHERE t3.feld3 = t4.feld4)

Backups hab ich genug ;O)
Danke + Gruß
Newwonder

Hallo!

Fast:

DELETE \*
FROM tabelle\_1 t1 
WHERE EXISTS(
 SELECT 'x'
 FROM tabelle\_2 t2 
 WHERE t1.feld1 = t2.feld2
 AND
 WHERE t1.feld3 = t2.feld4)

Gruß, Manfred

1 Like

Hallo Manfred und alle anderen Wissenden,

wenn ich die mit den richtigen Feldnamen abgeänderte SQL-Abfrage so eingebe und speichern möchte, bekomme ich immer einen Syntaxfehler
von Access 2000 angezeigt- alles ab EXISTS ist dann markiert.

DELETE \*
FROM tabelle\_1 t1
WHERE EXISTS(
 SELECT 'x'
 FROM tabelle\_2 t2
 WHERE t1.feld1 = t2.feld2
 AND
 WHERE t1.feld3 = t2.feld4)

Jemand ne Idee wo der Fehler liegt?
Wieso heisst das eigenlich:

SELECT 'x'

und nicht

SELECT '\*'

oder ist das das gleiche?
Herzlichen Dank + Gruß
Newwonder

Hallo NewWonder

Sorry wegen der verspäteten Antwort

wenn ich die mit den richtigen Feldnamen abgeänderte
SQL-Abfrage so eingebe und speichern möchte, bekomme ich immer
einen Syntaxfehler
von Access 2000 angezeigt- alles ab EXISTS ist dann markiert.

Wie ist denn der genaue Wortlaut der Fehlermeldung?

DELETE *
FROM tabelle_1 t1
WHERE EXISTS(
SELECT ‚x‘
FROM tabelle_2 t2
WHERE t1.feld1 = t2.feld2
AND
WHERE t1.feld3 = t2.feld4)

Jemand ne Idee wo der Fehler liegt?

feld3 muss auf tabelle_1 liegen und feld4 muss auf tabelle_2 liegen. Vielleicht ist da was vertauscht.

Wieso heisst das eigenlich:

SELECT ‚x‘

und nicht

SELECT ‚*‘

oder ist das das gleiche?

Und dann noch ein paar Worte zu SQL im Allgemeinen:
Es kommt in diesem Fall nicht drauf an, ob man SELECT ‚x‘, SELECT ‚*‘, SELECT 1 oder SELECT ‚MaxUndMoritz‘ schreibt. Wichtig ist, dass ÜBERHAUTP etwas selektiert wird. Denn die Funktion „EXISTS()“ liefert den Wert TRUE, wenn ein oder mehrere Datensätze in der Unterabfrage gefunden wurden, und den Wert FALSE, wenn kein Datensatz gefunden wurde. Welcher Art der Datensatz ist, den man zurückgibt, ist unwichtig; ich persönlich bevorzuge ‚x‘.
Die Unterabfrage liefert in diesem Beispiel also für jeden Datensatz in „tabelle_2“ ein x, wenn die Werte in „feld2“ und „feld4“ mit den Werten von „feld1“ und „feld3“ des aktuellen Datensatzes von „tabelle_1“ übereinstimmen. Wenn mindestens 1 ‚x‘ zurückgegeben wird, liefert die Funktion „EXISTS()“ den Wert TRUE, und der aktuelle Datensatz von „tabelle_1“ kann gelöscht werden. Ansonsten wird der aktuelle Datensatz nicht gelöscht, und der DELETE-Befehl springt zum nächsten Datensatz von „tabelle_1“

Hoffe, dass ich dir damit helfen konnte.
Wenn nicht, einfach nochmal melden.

Gruss: Christian

1 Like

Hallo Christian

Sorry wegen der verspäteten Antwort

Kein Problem, muss ja nicht alles auf dir hängen bleiben ;O)
Ich freu mich wenn sich überhaupt jemand meines Problems annimmt.
Danke auch für deine weiterführenden Erklärungen!

Wie ist denn der genaue Wortlaut der Fehlermeldung?

Der lautet:
Syntaxfehler. in Abfrageausdruck ‚EXISTS
(SELECT ‚x‘ FROM U_KD t2
WHERE t1.KD_k = t2.KD_k AND
WHERE t1.PLZ = t2.PLZ)‘

bei folgender SQL-Anweisung:

DELETE \*
 FROM KD t1 WHERE EXISTS
 SELECT 'x' 
 FROM U\_KD t2 
 WHERE t1.KD\_k = t2.KD\_kurz 
 AND 
 WHERE t1.PLZ = t2.PLZ)

In der Tabelle [KD] gibts die Felder „KD_k“ und „PLZ“
und in der Tabelle [U\_KD] die Felder „KD_kurz“ und PLZ",
also dürfte da doch nicht das Problem liegen, oder?

In der Tabelle [KD] sind ca. 15000 Datensätze und „KD_k“
ist leider kein eindeutiges Feld, „Meyer“ gibts zum Beispiel
5x. In [U\_KD] sind ca. 5000 Datensätze und „Meyer“ gibts nur
2x, die Datensätze sind aber über die PLZ eindeutig zu
indentifizieren.

Jetzt möchte ich die 2 Meyer aus [U\_KD] in [KD] löschen.
Dürfte doch eigentlich der richtige Weg sein, oder?

Gruß
Newwonder

Hallo Nochmal!

Am Morgen früh bin ich immer ein bisschen blind, deshalb habe ich den Fehler erst jetzt gesehen :smile: !
Der Syntaxfehler kommt natürlich davon, dass du 2 mal WHERE in der Unterabfrage verwendet hast. Die richtige Abfrge lautet:

DELETE \*
FROM tabelle\_1 t1
WHERE EXISTS(
 SELECT 'x'
 FROM tabelle\_2 t2
 WHERE t1.feld1 = t2.feld2
 AND
 t1.feld3 = t2.feld4)

So müsste es laufen.

Gruss: Christian

1 Like

=)
Werde ich gleich ausprobieren - danke schonmal!

Gruß
Newwonder

OT: Klappt!
Jetzt gehts einwandfrei… Danke!