Bedingter Delete

B

ByeBye 158824

Hallo Leute,

ich möchte aus einer Tabelle etwas löschen. Die Bedingung hängt aber auch von einer anderen Tabelle ab.

1. Tabelle (Kurse)

id | kurs_name | kurs_wochentag

2. Tabelle (Wunsch)

id | kurs_id | s_id

Die Spalte s_id ist ebenso ein FK aus einer anderen Tabelle.

Vorgehen:
Jetzt möchte ich aus der Tabelle Wünsche für den Schüler mit der ID XY die kurs_ids löschen, welche den gleichen Wochentag haben wie die kurs_id yz.

Ich habe mir schon mal einen Select Befehl zusammengebaut, der die obige Abfrage liefert, aber wie das mit dem Delete funktionieren soll...keinen Plan?

Hier mal der SELECT, der auch funktioniert.

Code:
 SELECT Wunsch.kurs_id
 FROM Wunsch
 INNER JOIN Kurse
 ON wunsch.kurs_id=Kurse.kurs_id
 WHERE Wunsch.s_id=40 and Kurse.kurs_wochentag LIKE 
       (SELECT kurs_wochentag FROM Kurse WHERE kurs_id=11)

Hat irgendjemand einen Vorschlag wie ich die ermittelten Spalten dann auch löschen kann?

Vielen Dank für jede Hilfestellung
 
Hallo Leute,


Ich habe mir schon mal einen Select Befehl zusammengebaut, der die obige Abfrage liefert, aber wie das mit dem Delete funktionieren soll...keinen Plan?

Hier mal der SELECT, der auch funktioniert.

Code:
 SELECT Wunsch.kurs_id
 FROM Wunsch
 INNER JOIN Kurse
 ON wunsch.kurs_id=Kurse.kurs_id
 WHERE Wunsch.s_id=40 and Kurse.kurs_wochentag LIKE 
       (SELECT kurs_wochentag FROM Kurse WHERE kurs_id=11)

Hat irgendjemand einen Vorschlag wie ich die ermittelten Spalten dann auch löschen kann?

Vielen Dank für jede Hilfestellung
Hallo,

Ersetzte einfach den SELECT - Teil durch ein Delete...

Code:
DELETE FROM Wunsch.....



Gruss
 
Hi dbwizard,

leider funktioniert dein Lösungsvorschlag nicht. Hmm...andere Idee?

Ich benutze die Java DB von Apache Derby. Hängt es damit zusammen, dass diese Art des Deletes von Derby nicht unterstützt wird? Kann allerdings nichts dazu finden!
 
Zuletzt bearbeitet von einem Moderator:
Auch hiermit funktioniert es nicht, weil eine skalare Unterabfrage nur einen Wert zurückliefern kann...

Code:
DELETE FROM wunsch
WHERE wunsch.s_id=(
      SELECT wunsch.s_id
      FROM wunsch
      INNER JOIN kurse
      ON wunsch.kurs_id=kurse.kurs_id
      WHERE wunsch.s_id=40 and kurse.kurs_wochentag LIKE 
             (SELECT kurs_wochentag FROM kurs WHERE kurs_id=11))

Kann das wirklich sein, dass die Java DB keine Inner Join im Delete Befehl erlauben?
 
Ja das ist wohl ein bißchen zu kompliziert für die Java-DB.

Versuch mal sowas:
SQL:
SELECT k.*
FROM wunsch w
INNER JOIN kurs k 
INNER JOIN (SELECT tag FROM kurs WHERE id=2) AS t
ON w.kurs_id = k.id AND k.tag=t.tag

Das ist ein etwas einfacheres SQL was das bewirken sollte was du suchst. Eventuell geht damit auch das DELETE. Mit der ON-Clause bin ich mir nicht ganz sicher. Das wird hier ein wenig http://db.apache.org/derby/docs/10.5/ref/ (unter TableExpression ganz unten das Beispiel) anders beschrieben.

Hab hier nur ne MySQL zum testen.
 
Hallo Zeja,

ich habe deinen Code versucht auszuführen, aber da meckert die Datenbank und gibt als Fehler immer nur
Code:
Fehlercode 30000, SQL-Status 42X01: Syntaxfehler: Encountered "<EOF>" at line 5, column 56.
zurück.

Denke der kommt mit dem 2-fachen Inner Join nicht zurecht, was meinst du?
 
SQL:
DELETE FROM wunsch
WHERE wunsch.s_id IN (
      SELECT wunsch.s_id
      FROM wunsch
      INNER JOIN kurse
      ON wunsch.kurs_id=kurse.kurs_id
      WHERE wunsch.s_id=40 and kurse.kurs_wochentag LIKE 
             (SELECT kurs_wochentag FROM kurs WHERE kurs_id=11))

Für alle die es interessiert. Ich habe den trivialen Fehler gefunden. Anstatt dem Gleichheitszeichen in der aller ersten WHERE-Klausel einfach ein in setzen und schon funktioniert es. Logisch, weil das in ja auch mehrere Werte für WHERE zulässt.

Gruß Emil
 
Zuletzt bearbeitet von einem Moderator:
Zurück