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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 136241
Url: https://administrator.de/contentid/136241
Ausgedruckt am: 22.11.2024 um 18:11 Uhr
3 Kommentare
Neuester Kommentar
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
Aber natürlich erstmal testen, was herauskommt bei einem
Grüße
Biber
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
Moin oliPro,
deshalb habe ich ja geschrieben "Aber natürlich erstmal testen, was herauskommt bei einem SELECT.."
Dann nehmen wir eine der vielen anderen Möglichkeiten
-oder-
Wenn das plausibler aussieht, dann "SELECT A.*" durch "DELETE FROM A" ersetzen.
Grüße
Biber
deshalb habe ich ja geschrieben "Aber natürlich erstmal testen, was herauskommt bei einem SELECT.."
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