Tom: Denkfehler im Lösch-Query

Beitrag lesen

Hello,

der Query soll alle Einträge in tab_produkte löschen, für deren ID_Kategorie es keine Kategorie mehr gibt, also keinen Datensatz mehr in der tab_kategorien mit eben diesem _kategorie-ID:

das nennt man auch Integritätstest

Du kannst Dir das so vorstellen:
Welche Datensätze sollen aus der Ergebismenge von PRODUKT aussortiert werden?
Die Ergebnismenge ist diejenige, die Du löschen willst.
Aus der musst Du daher vorher diejenigen aussortieren, die _nicht_ gelöscht werden sollen.

select ID_PRODUKT from PRODUKT where PRODUKT.ID_PRODUKT = KATEGORIE.ID_KATEGORIE;

Für diese Produkte gibt es also eine Kategorie. WIr wollen sie behalten!

Und dann sagst Du, dass Du gerade das Gegenteil davon haben willst:

select ID_PRODUKT from PRODUKT
left join KATEGORIE on (PRODUKT.ID_KATEGORIE = KATEGORIE.ID_KATEGORIE) where KATEGORIE.ID_KATEGORIE is NULL order by PRODUKT.ID_PRODUKT;

left Join  bedeutet soviel wie:
  Die linke Tabelle wird vollständig durchlaufen, die rechte folgt
  Wenn in der rechten aber der Zeiger auf NULL steht, wurde kein Partner gefunden.

Harzliche Grüße vom Berg
http://www.annerschbarrich.de

Tom

--
Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
Nur selber lernen macht schlau