Seite 1 von 1

DELETE FROM mit verknüpften Tabellen

Verfasst: So, 19.10.2008 13:16
von Andreas_
Hallo zusammen,

um eine relativ große Tabelle auzumisten möchte ich eine SQL-Abrage (HSQLDB) unter Extras / SQL absetzen.

Die zu reduzierende Tabelle RMABestand enthält die Felder ArtikelNr, Menge, und Eingangsdatum. In der Tabelle Artikelstamm ist zu jedem Artikel die Kreditorennr hinterlegt.
Nun möchte ich für einen bestimmten Kreditor in RMABestand alle Einträge löschen deren Eingangsdatum älter als ein bestimmter Wert ist und das Feld Menge leer ist.

Eine mit dem Assistenten erstellte Abfrage ergibt folgenden SQL-Code und zeigt richtig die Einträge die auf der "Abschussliste" stehen:

Code: Alles auswählen

SELECT "RMABestand"."ArtikelNr", "RMABestand"."Menge", "RMABestand"."Eingangsdatum", "Artikelstamm"."Kreditorennr" FROM "Artikelstamm" AS "Artikelstamm", "RMABestand" AS "RMABestand" WHERE "Artikelstamm"."Nr" = "RMABestand"."ArtikelNr" AND "RMABestand"."Menge" IS NULL AND "RMABestand"."Eingangsdatum" < {D '2008-03-11' } AND "Artikelstamm"."Kreditorennr" = '700030'
Wenn ich jetzt den SELECT-Teil durch DELET FROM ersetze, bekomme ich die Fehlermeldung "Column not found: Artikelstamm.Nr":

Code: Alles auswählen

DELETE FROM "RMABestand" WHERE "Artikelstamm"."Nr" = "RMABestand"."ArtikelNr" AND "RMABestand"."Menge" IS NULL AND "RMABestand"."Eingangsdatum" < {D '2008-03-11' } AND "Artikelstamm"."Kreditorennr" = '700030'
Aus den Weiten des Netztes hat mir Google folgenden Tipp gebracht:

Code: Alles auswählen

DELETE FROM "RMABestand" WHERE (SELECT "RMABestand"."ArtikelNr", "RMABestand"."Menge", "RMABestand"."Eingangsdatum", "Artikelstamm"."Kreditorennr" FROM "Artikelstamm" AS "Artikelstamm", "RMABestand" AS "RMABestand" WHERE "Artikelstamm"."Nr" = "RMABestand"."ArtikelNr" AND "RMABestand"."Menge" IS NULL AND "RMABestand"."Eingangsdatum" < {D '2008-03-11' } AND "Artikelstamm"."Kreditorennr" = '700030')
Allerdings bekomme ich, nach dem der Rechner einige Zeit gearbeitet hat die Fehlermeldung "Not a condition"

Nach zwei Tagen googeln und probieren gehen mir die Ideeen aus, hab jemand noch einen Tipp?

Viele Grüße,
Andreas

Re: DELETE FROM mit verknüpften Tabellen

Verfasst: So, 19.10.2008 15:47
von Barlee
Hallo Andreas,

spontan fällt folgendes auf:
Eine mit dem Assistenten erstellte Abfrage ergibt folgenden SQL-Code und zeigt richtig die Einträge die auf der "Abschussliste" stehen:
Das muss auch korrekt sein, denn Du stellst eindeutig den Bezug zu zwei Tabellen her, die Du anschließend über WHERE mit Konditionen versiehst.

Code: Alles auswählen

FROM "Artikelstamm" AS "Artikelstamm", "RMABestand" AS "RMABestand"
Soweit also OK.
Wenn ich jetzt den SELECT-Teil durch DELET FROM ersetze, bekomme ich die Fehlermeldung "Column not found: Artikelstamm.Nr":
Richtig. Das muss auch so sein, denn Du nimmst nur Bezug auf eine Tabelle, nämlich auf "RMABestand" (DELETE FROM "RMABestand"). Trotzdem verweist Du in der WHERE Klausel auf Spalten einer Tabelle ("Artikelstamm") die bisher nicht "bekanntgegeben" wurde. "Column not found: Artikelstamm.Nr": ist somit nachvollziehbar.
Aus den Weiten des Netztes hat mir Google folgenden Tipp gebracht: ... Fehlermeldung "Not a condition"
Die Fehlermeldung kannst Du wörtlich nehmen, denn in dem geklammerten Ausdruck hinter WHERE steht nichts anderes als eine komplette Ergebnistabelle. Jedoch keine einschränkende Bedingung!

Vereinfacht könnte man dieses (falsche) Beispiel so konstruieren:

Code: Alles auswählen

SELECT * FROM [Tab_A] WHERE [SELECT * FROM Tab_B]
Und das wird nicht funktionieren!

Da HSQLDB (anscheinend) den multiple-table Syntax bei DELETE nicht unterstützt, bliebe nur der Weg über entsprechende Unterselects, also z.B.

Code: Alles auswählen

DELETE FROM [Tab_A]
WHERE [Tab_A].[Spalte1] IN (SELECT [Spalte1] FROM [Tab_A],[Tab_B] WHERE [Spalte2] >[Spalte3])
AND [Tab_A].[Spalte2] IN (SELECT [Spalte2] FROM [Tab_A],[Tab_B] WHERE [Spalte1] =[Spalte3])
Versuche Deine Abfrage am besten so aufzubauen.

Gruß Barlee

Re: DELETE FROM mit verknüpften Tabellen

Verfasst: So, 19.10.2008 22:28
von Andreas_
Hallo Barlee,

vielen Dank für Deine Hinweise.
Ich bin jetzt schon seit Stunden am herumprobieren, inzwischen funktioneren die einfachsten Dinge nicht mehr.
Es ist wohl besser, ich lasse es für heute gut sein und probiere es morgen mit frisch gebootetem Hirn wieder.

Gute Nacht,
Andreas