2009-12-08 3 views
8

Cant scheinen zu trainieren, was im falsch machen hierProblem Löschen von Zeilen linken äußeren Verknüpfung in mysql

SELECT * FROM tbl_imagelabel LEFT OUTER JOIN tbl_image ON tbl_imagelabel.label_id = tbl_image.label_id WHERE tbl_image.label_id is NULL

zeigt die genauen Zeilen möchte ich mit löschen. aber wenn ich von SELECT * FROM ändern, es zu löschen funktioniert nicht

DELETE FROM tbl_imagelabel LEFT OUTER JOIN tbl_image ON tbl_imagelabel.label_id = tbl_image.label_id WHERE tbl_image.label_id is NULL

+0

Gibt es eine Fehlermeldung? – Bobby

+0

Führen Sie 'EXPLAIN EXTENDED' vor der Abfrage 'DELETE' aus und fügen Sie die Ausgabe hier ein. –

Antwort

10

Sie versuchen, aus mehreren Tabellen in einer einzigen Abfrage mit dieser Syntax zu löschen. Versuchen Sie, etwas mehr wie (und dies ist nur ein loses Beispiel nicht optimiert werden oder etwas gemeint ist):

DELETE FROM tbl_imagelabel 
WHERE label_id IN (
    SELECT tbl_imagelabel.label_id 
    FROM tbl_imagelabel 
    LEFT OUTER JOIN tbl_image 
     ON tbl_imagelabel.label_id = tbl_image.label_id 
    WHERE tbl_image.label_id IS NULL 
) 
+0

34 Sekunden machen den Unterschied :-) – cdonner

+0

LoL ... ich weiß ... +1 für die Lösung in beide Richtungen: D –

+0

glücklich, den Gefallen zurück zu geben :-) – cdonner

4
DELETE FROM tbl_imagelabel 
where label_id IN 
(
SELECT tbl_imagelabel.label_id FROM tbl_imagelabel 
LEFT OUTER JOIN tbl_image 
ON tbl_imagelabel.label_id = tbl_image.label_id WHERE tbl_image.label_id is NULL 
) 

dass label_id unter der Annahme, ist der eindeutige Primärschlüssel.

6

Ich glaube, das macht das gleiche ohne die explizite Join.

DELETE FROM tbl_imagelabel 
WHERE label_id NOT IN (SELECT label_id FROM tbl_image) 
+0

+1 guter Fang! (dang 15 char Grenze für Kommentare) –

3

Während alle hier gegebenen Antworten alternative Mittel bereitstellen, das spezielle Beispiel in der Frage gegeben zu lösen, sie alle tun, ohne tatsächlich eine linke äußere einschließlich verbinden explizit in der Delete-Anweisung. Um das zu tun, müssen Sie die 'weiter verwenden' Anweisung wie folgt:

DELETE FROM til USING tbl_imagelabel as til LEFT OUTER JOIN tbl_image as ti 
ON til.label_id = ti.label_id WHERE ti.label_id is NULL 

Referenzen:

8

Für weitere Referenz, auf MySQL 5+:

DELETE tbl1.* FROM tbl1 LEFT JOIN tbl2 USING(fld) WHERE tbl2.fld IS NULL; 

Es wird jede Orph löschen ans TBL1 mit fld als beitreten.

GL Paulo Bueno

Verwandte Themen