Delete über zwei Tabellen in einem Statement?

Hallo, ich glaube ich stehe gerade ganz furchtbar auf dem Schlauch.

Ich habe zwei Tabellen:

Test (GUID VARCHAR2(36) PRIMARY KEY xxx REFERENCES Object(GUID) #PK#, Name VARCHAR2, …)
Object (GUID VARCHAR2(36) #PK#), …)

Nun möchte ich aus “Test” bspw. alle Zeilen löschen, in denen der Name „abc“ ist. Parallel dazu möchte ich in „Object“ alle Zeilen löschen, auf die die GUIDs der zu löschenden Zeilen referenzieren.

Mein Problem ist nun, dass ich es so lösen würde:

SELECT GUID FROM Test WHERE (Name = ‘abc’); ->Ergebnis in Liste (Java) zwischenspeichern
DELETE FROM Test WHERE (Name = ‘abc’);
DELETE FROM Object WHERE (GUID = xyz); -> Liste.length() – oft ausführen.

Leider brauche ich aber eine Lösung, in der ich fertige Statements generieren kann, die ich dann per Batch-Execute ausführen kann, also ohne mir in Java Werte zwischenspeichern zu müssen.

Was gibt es da für eine Möglichkeit? Kann ich das ganze in irgendwie doch in ein Statement verpacken? Oder die Werte irgendwie auf Datenbanklevel zwischenspeichern?

Über Hilfe wäre ich mal wieder sehr dankbar!

Gruß, Pianoman

Hallo,

warum machst du es nicht anders rum?
DELETE FROM object WHERE guid IN (SELECT guid FROM test WHERE …)
DELETE FROM test WHERE …

Einige DB (MySQL z.B.) unterstützen nicht in allen gängigen Versionen innere Selects.
Dafür können einige DBs auch einen Join im DELETE verarbeiten.
Aber eigentlich ist eine solche Logik Aufgabe eines FOREIGN KEY Constraints. Die können in der Regel ein ON DELETE CASCADE. (Allerdings scheint mir die Logik deiner Tabellen seltsam zu sein)

Gruß

Peter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

warum machst du es nicht anders rum?
DELETE FROM object WHERE guid IN (SELECT guid FROM test WHERE
…)
DELETE FROM test WHERE …

Die Idee finde ich gut, aber der Subselect darf doch maximal eine Row zurückgeben, oder?

Aber eigentlich ist eine solche Logik Aufgabe eines FOREIGN
KEY Constraints. Die können in der Regel ein ON DELETE
CASCADE. (Allerdings scheint mir die Logik deiner Tabellen
seltsam zu sein)

Das klingt aber viel logischer als mein Ansatz, da hast Du völlig Recht. Das meinte ich mit „auf dem Schlauch stehen“ :wink:

Vielen Dank mal wieder an Dich für Deinen kompetenten Tipp!

Gruß, Pianoman

Hi

Die Idee finde ich gut, aber der Subselect darf doch maximal
eine Row zurückgeben, oder?

Ne nur Spaltenselects, also selects, die anstatt einer Spalte stehen, dürfen nur eine Zeile zurückgeben. Inlineviews, also Subselects, die anstatt einer Tabelle, oder wie hier anstatt einer Werteliste stehen, können beliebig viele Zeilen zurückgeben.

Jens