PDA

Vollständige Version anzeigen : Löschabfrage


Gismor0808
26.04.2011, 15:50
Hallo,

ich habe sicherlich 150 verschiedene Beiträge zu Löschabfragen gefunden und gelesen. Hat mir aber nicht wirklich geholfen.

Ich habe ein Löschabfrage aus 2 Tabellen erstellt und das Ergebnis in der Anzeige ist richtig.
Beide Tabellen sind über Feld2 verknüpft
Alles aus "Domain" anzeigen und nur die aus "Bestand"........
Wenn ich aber auf "Ausführen" gehe:

"Löschen aus Angegebenen Tabellen nicht möglich"

Tabelle "Bestand" mit Feld1, Feld2, Feld3 hat weniger Datensätze als
Tabelle "Domain" mit Feld1, Feld2 bis Feld8

Feld2 (ist Text) wird verglichen
Der Angezeigte Wert soll nun in Tabelle "Domain" gelöscht werden.

Was mache eigendlich falsch??

avogt_at_home
26.04.2011, 16:16
Hallo,
sind die Tabellen im Beziehungseditor in Beziehung gebracht worden?
Ist dabei relationale Integrität eingestellt worden mit Löschweitergabe?

Ansonsten lösche in beiden Tabellen separat.
Zuerst in der Detail-Tabelle danach in der Master-Tabelle. (1:n)

Willst du die Löschung per Code aufrufen, dann verwende folgendes:
Dim db AS DAO.Database
set db = Currentdb
db.Execute "Delete From TabelleDetail..."
db.Execute "Delete From TabelleMaster..."
set db = nothing

Gruß Andreas

Gismor0808
26.04.2011, 16:48
Hallo,
nein, die Tabellen stehen nicht in Beziehung.
ich habe nur eine Beziehung in der Abfrage erstellt um die Daten anzeigen, die in der Domain-Tabelle gelöscht werden sollen.

ebs17
26.04.2011, 17:54
Ich habe ein Löschabfrage aus 2 Tabellen erstellt und das Ergebnis in der Anzeige ist richtig.
Beide Tabellen sind über Feld2 verknüpft
Alles aus "Domain" anzeigen und nur die aus "Bestand"........
Vielleicht solltest Du die Abfrage zeigen und nicht nur darüber reden.
Auch ist mir das genaue Anliegen noch schleierhaft. Wenn Du in der Domain-Tabelle löschen willst und dazu alles darin anzeigst (zum Löschen) und das Deiner Meinung nach richtig ist, brauchst Du keine zusätzliche Verknüpfung zu einer weiteren Tabelle. Mehr wie alles löschen kann man nicht.

Zuri
26.04.2011, 22:04
Hallo Gismor0808,

wenn Du nur die Werte aus der Tabelle Domain löschen willst würde ich das in mehreren Arbeitsschritten tun und nicht in einem.

1. Die Verknüpfung läßt Du so wie sie ist.
2. Erstelle eine neue Spalte in der Tabelle "Domain" z. B. mit dem Namen "Flag" und nehme diese noch nachträglich in die Auswahlabfrage rein.
3. Führe eine Aktualisierungsabfrage in der Verknüpfung auf diese Spalte aus und aktualisiere z. B. mit X.
4. Mache eine neue Löschabfrage nur auf die Tabelle Domain und lösche alle Zeilen in denen in der Spalte "Flag" ein X steht raus.

Fertig.

Dein Lösungsansatz ist leider nicht gut, weil Du ja auf gar keinen Fall die Werte aus Bestand löschen willst sondern nur aus Domain. Da würde ich auf gar keinen Fall mit einer Verknüpfung und einer Löschabfrage in einem Arbeitsgang arbeiten. Eine Löschabfrage funktioniert eigentlich nur dann, wenn Du die Zeilen aller Spalten einer Tabelle löschst. Du hast aber da nicht eine Tabelle, sondern zwei Tabellen und in der einen Tabelle sollen die Werte drin bleiben. Deshalb geht das so gar nicht. Eigentlich hast Du ja noch Glück gehabt, dass das so nicht geht. Wäre es theoretisch gegangen hättest Du Deine Werte aus beiden Tabellen gelöscht. Die Tabelle mit den Beständen wäre dann kaputt gegangen.

Dann noch ein Praxistip. Mache Dir von beiden Tabellen zuerst eine Sicherungskopie und lege erst dann los.

Viele Grüße aus Stuttgart

Zuri

:rolleyes:

Gismor0808
27.04.2011, 11:39
Guten Tag,

erst mal danke für den Lösungsvorschlag.
Habe mir über Nacht mal Gedanken gemacht und volgende Lösung:

1 Ich habe eine Tabelle mit dem aktuellem Bestand, ist eine verknüpfte Exceltabelle.

2. Ich habe eine Anfüge-Abfrage erstellt, welche alle Neuen Domains in meine bestehende Tabelle einfügt.

3. Die Tabelle mit dem aktuellem Bestand ist nun mit der Domain-Tabelle über die Felder Domain--Domain "nur zeigen wenn alle gleich" verknüpft.

So werden "nicht mehr vorhandenen Domains", nicht mehr gezeigt. Eigendlich das Ergebniss was ich haben wollte.

Nur noch mal eine obligatorische Frage:

Die verknüpften Tabellen Domain (Access-Tabelle) und Bestand (Excel-Verknüpfung) stehen in Beziehungstap ...Undefiniert......?????
Habe mal ein Bild gemacht.

ebs17
27.04.2011, 12:05
3. Die Tabelle mit dem aktuellem Bestand ist nun mit der Domain-Tabelle über die Felder Domain--Domain "nur zeigen wenn alle gleich" verknüpft.

So werden "nicht mehr vorhandenen Domains", nicht mehr gezeigt. Eigendlich das Ergebniss was ich haben wollte.
Zum Löschen müsstest Du Dir aber (umgedreht!) das anzeigen lassen, was ungleich ist.

Gismor0808
27.04.2011, 12:41
habe natürlich nur ungleich anzeigen lassen.
Gut gelesen, war Schreibfehler von mir.......

Atrus2711
27.04.2011, 12:48
Hi,

Access (bzw. die interne Jet-Engine) tut sich ein bisschen schwer mit Löschabfragen, die Joins ("Beziehungslinien") enthalten.

Du kannst aber trotzdem aus Tabelle A alle Sätze entfernen, die sich (anhand Gleichheit bestimmter Felder) in Tabelle B befinden: mit einem Subselect.

DELETE * FROM TabelleA WHERE FeldA In (SELECT FeldB FROM TabelleB)

Und zum Beziehungstyp Undefiniert: der entsteht, wenn die Beziehung auf beiden Seiten Felder umfasst, die nicht den jeweiligen Primärschlüssel ausmachen. Mangels Primärschlüsseln ist das bei deinem Tabellengefüge immer der Fall.

ebs17
27.04.2011, 13:01
habe natürlich nur ungleich anzeigen lassen
Das verstehe ich nun gar nicht. Wenn ich zwei Tabellen über ungleich verknüpfe, erhalte ich ja ein fast komplettes Kreuzprodukt: Bis auf einen Datensatz (bei eindeutigen Schlüsseln) dürften alle übrigen Datensätze ungleich sein, also jeder Datensatz wird mit fast jedem der Gegentabelle kombiniert.

Um zum vermutlichen Ausgangspunkt zu kommen. Um alle Datensätze aus der einen Tabelle zu löschen, die in der anderen nicht vorhanden sind, könnte eine Abfrage etwa so aussehen:
DELETE *
FROM Domailiste D
WHERE NOT EXISTS
(SELECT Null FROM [Bestand-aktuell] B
WHERE D.Domain = B.Domain)
Das Sternchen wird nur zum Gucken benötigt, nicht für das Löschen - es werden eh nur ganze Datensätze gelöscht.

Gut gelesen
Programmieren ist eine präzise Tätigkeit. Man kommt nicht sehr weit, wenn man nur jedes zweite Wort oder jede zweite Aussage hernimmt (oder gar beliebige). Abgeleitet davon sollte man auch LESEN (was da steht) und SCHREIBEN (was man wirklich will) können.

Gismor0808
27.04.2011, 15:34
Ich melde mich noch mal zu den Abfragen

Habe mal Bilder der Abfragen angehangen.
1. Abfrage mit "ist Null" ich bekomme einen DS der nicht in Bestand-aktuell ist angezeigt.
2. Das Abfrageergebnis
3. Das Abfrageergebnis ohne "ist Null"

DELETE *
FROM Domailiste D
WHERE NOT EXISTS
(SELECT Null FROM [Bestand-aktuell] B
WHERE D.Domain = B.Domain)

fragt ab und fragt ab..........
wo kommt es hin, doch in die Abfrage oder?

ebs17
27.04.2011, 15:43
fragt ab und fragt ab..........
Was soll uns das sagen?
wo kommt es hin
Siehe SQL-Ansicht (http://www.ardiman.de/datenbanken/grundlagen/abfragen.html#SEC2)
Eine Abfrage(definition) besteht aus einer SQL-Anweisung (Text nach Regeln), nicht aus Pfeilen und Bildern (wie man nach dem Abfrageeditor glauben könnte.

Gismor0808
27.04.2011, 16:19
genau da steht diese und führt sich aus......

Die Pfeile und Bilder soll stehen nur für * zum Gucken