2009-12-08 18 views
8

Cant wydają się do treningu, co robię źle tutajproblem podczas usuwania wiersze wykorzystujące lewe sprzężenie zewnętrzne w 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

pokazuje dokładny wiersze, które chcę usunąć. ale jeśli zmienię SELECT * FROM aby usunąć z niej robi pracować

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

Czy wyświetlany jest komunikat o błędzie? – Bobby

+0

Uruchom 'EXPLAIN EXTENDED' przed zapytaniem' DELETE' i wklej tutaj dane wyjściowe. –

Odpowiedz

10

Próbujesz usunąć z wielu tabel w jednym zapytaniu z tej składni. Spróbuj czegoś więcej jak (i ​​to tylko luźny przykład, nie ma być zoptymalizowany lub cokolwiek):

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 sekundy robią różnicę :-) – cdonner

+0

LoL ... Wiem ... +1 dla rozwiązania w obu kierunkach: D –

+0

chętnie zwrócę przysługę :-) – 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 
) 

zakładając, że label_id jest unikalny klucz podstawowy.

6

Wierzę, że robi to samo bez wyraźnego dołączenia.

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

+1 dobry połów! (maks. 15 znaków na komentarze) –

3

Podczas gdy wszystkie odpowiedzi podane są alternatywnymi sposobami rozwiązywania konkretnego przykładu podanego w pytaniu wszyscy robią to bez faktycznie w tym lewe sprzężenie zewnętrzne wyraźnie w instrukcji delete. Aby to zrobić, trzeba się 'za pomocą' oświadczenie następująco:

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 

Referencje:

8

w celu uzyskania dalszych odniesienia, na MySQL 5+:

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

Spowoduje to usunięcie dowolnego obiektu ans na TBL1 przy użyciu fld jako łącz.

GL Paulo Bueno

Powiązane problemy