2009-12-08 21 views
8

katılmak ne im ben silmek istediğiniz tam satırları gösterir Burada yanlışsilinirken sorun satırlar 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

yapıyor. i SELECT * değiştirirseniz ama O sözdizimi ile tek sorguda birden çok tablodan silmek için çalışıyoruz

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

bir hata mesajı var mı? – Bobby

+0

'DELETE' sorgusunun önündeki' EXPLAIN EXTENDED' komutunu çalıştırın ve çıktıyı buraya yapıştırın. –

cevap

10

işe doesnt silmek. daha fazla gibi bir şey deneyin (ve bu sadece gevşek bir örnektir, optimize ya da bir şey olması amaçlanmamıştır): o label_id varsayarak

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 saniye fark yaratır :-) – cdonner

+0

LoL ... Biliyorum ... her iki çözüm için de +1: D –

+0

favoriyi iade etmekten mutlu :-) – 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 
) 

benzersiz birincil anahtardır.

6

Bunun, açık bir katılım olmadan aynı şeyi yaptığına inanıyorum. Burada verilen tüm cevapları soru verilen spesifik örnek çözme alternatif araçları sağlama iken

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

+1 iyi yakalama! (yorumlarda 15 karakterlik sınır sınırı) –

8

:

aşağıdaki gibi yapmak için, 'KULLANMA' deyimi gerekir
DELETE tbl1.* FROM tbl1 LEFT JOIN tbl2 USING(fld) WHERE tbl2.fld IS NULL; 

Herhangi bir orph'i silecek a0, TBL1, katılımı olarak kullanılabilir.

GL Paulo Bueno

İlgili konular