mySQL: DELETE mit Formel! Problem!

Ich habe zwei Tabellen, sagen wir mal A und B.

In beiden gibt es eine Spalte ID.

Nun möchte ich aus der Tabelle A alle Zeilen löschen deren ID nicht in Tabelle B Spalte ID ist.

z.B.

in A sind folgende IDs: 1,2,3,4,5
in B sind folgende IDs: 1,3

nun möchte ich aus A löschen: 2,4,5

Gibts da eine (einzelne) DELETE-Formel für?

mfg Slick

hi!

delete from tabellea a
where not exists (select 1 from tabelleb b where a.id = b.id);

oder

delete from tabellea a
where a.id not in (select b.id from tabelleb b);

ich würde ersteres bevorzugen

grüße,
tomh

mySQL: keine Subquerys?!

delete from tabellea a
where not exists (select 1 from tabelleb b where a.id = b.id);

oder

delete from tabellea a
where a.id not in (select b.id from tabelleb b);

Habs probiert! Scheint nicht zu funzen… Ist es möglich dass mySQL keine Subquerys unterstützt?

Wie liese sich o.g. Problem dennoch lösen?

mfg Slick

mySQL wird erst ab Version 4.1 subselects können.
D.H. es gibt derzeit leider keine so schöne Lösung für die Fragestellung.

Grüße
Bruno

Habs probiert! Scheint nicht zu funzen… Ist es möglich dass
mySQL keine Subquerys unterstützt?

So ist es.

Wie liese sich o.g. Problem dennoch lösen?

wenn du nicht in einer Schleife alle Datensätze durchgehen willst und für jeden eine Query machst, bliebe noch dir selbst das Ergebnis des Subselects zusammenzubasteln, d.h.

erstmal

SELECT id FROM tabelleb

und dann das Ergebnis verarbeiten (z.b. in einer Programmiersprache) und ein SQl-Statement der Art

DELETE FROM tabellea WHERE id NOT IN (1, 3)

zusammenbauen. Je nach Anzahl Datensätzen wird das recht lang, damit hat mySQL aber kein Problem.

Grüße
Bruno

Danke, aber… (max. Query-Größe in mySQL)
Danke, wirklich sehr schnell!!!

Aber weil michs grad so interessiert, wie groß kann ein Query bei mySQL maximal sein?

mfg Slick

Das ist vom Parameter max_allowed_packet abhängig, per default sollte es ein megabyte sein.

Grüße
Bruno