olipro
Goto Top

MySQL-Tabelle bereinigen mit DELETE - USING - JOIN

Verknüpfte Tabellen bereinigen, wenn es einen Datensatz (der eigentlich verknüpft sein sollte) nicht gibt.

MySQL-Client-Version: 5.0.22

Vorhanden ist Tabelle A und Tabelle B, die über X miteinander verknüpft sein sollten.
Jetzt möchte ich prüfen, ob das auch immer der Fall ist.
Wo es nicht so ist, soll der komplette Eintrag aus Tabelle A gelöscht werden.

Mein Problem liegt darin, dass ich nicht weiss, wie ich abfragen soll.
So in der Art war mein Ansatz ...

DELETE FROM A
USING A, B
WHERE B.X nicht vorhanden

Content-Key: 136241

Url: https://administrator.de/contentid/136241

Printed on: April 16, 2024 at 17:04 o'clock

Member: Biber
Biber Feb 18, 2010 at 08:37:18 (UTC)
Goto Top
Moin oliPro,

da gibt es für geschätzte n mySQL-Anwender circa n hoch 3 verschiedene Möglichkeiten.
Mit LEFT JOIN, mit NOT EXISTS, mit Unterabfrage...

Würde ich von der Satzanzahl und Kardinalität der Daten in A und B abhängig machen.
Vermutlich das kürzeste wäre

DELETE FROM A
 WHERE A.X <> ANY  (SELECT X FROM B);
-- oder gleichwertig das eher ungebräuchliche SOME
DELETE FROM A
 WHERE A.X <> SOME  (SELECT X FROM B);

Aber natürlich erstmal testen, was herauskommt bei einem
SELECT A.* FROM A
 WHERE A.X <> ANY  (SELECT X FROM B);

Grüße
Biber
Member: oliPro
oliPro Feb 18, 2010 at 08:47:25 (UTC)
Goto Top
Hallo Herr Biber ... face-smile

danke für den Tipp! Leider liefern beide Methoden (AND + SOME) alle Datensätze zurück face-sad

Gruß, oliPro
Member: Biber
Biber Feb 18, 2010 at 09:31:06 (UTC)
Goto Top
Moin oliPro,

deshalb habe ich ja geschrieben "Aber natürlich erstmal testen, was herauskommt bei einem SELECT.." face-wink

Dann nehmen wir eine der vielen anderen Möglichkeiten
SELECT A.*  
FROM A
LEFT JOIN B on A.X = B.X
WHERE B.X  IS NULL ;

-oder-
SELECT A.*
FROM A
WHERE A.X NOT IN (SELECT B.X FROM B);

Wenn das plausibler aussieht, dann "SELECT A.*" durch "DELETE FROM A" ersetzen.

Grüße
Biber