2009-12-08 19 views
8

cant sembrano allenamento che cosa sto facendo di sbagliato quiProblema eliminazione di righe utilizzando join esterno sinistro 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

mostra le righe esatte che voglio cancellare. ma se cambio SELECT * FROM eliminare dalla doesnt lavoro

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

C'è un messaggio di errore? – Bobby

+0

Esegui 'EXPLAIN EXTENDED' davanti alla query' DELETE' e incolla qui l'output. –

risposta

10

Stai cercando di eliminare da più tabelle in una singola query con quella sintassi. Prova qualcosa di più simile (e questo è solo un esempio di sciolto, non vuole essere ottimizzato o niente):

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 secondi fanno la differenza :-) – cdonner

+0

LoL ... Lo so ... +1 per la soluzione in entrambi i casi: D –

+0

felice di restituire il favore :-) – 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 
) 

assumendo che label_id è la chiave primaria unica.

6

Credo che questo faccia la stessa cosa senza il join esplicito.

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

+1 buona cattura! (limite di 15 caratteri sui commenti) –

3

Mentre tutte le risposte qui riportati forniscono mezzi alternativi per risolvere l'esempio specifico indicato nella domanda, fanno tutti così senza in realtà tra cui un join esterno sinistro in modo esplicito nella dichiarazione di cancellazione. Per fare questo, è necessario il 'usando' economico come segue:

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 

Riferimenti:

8

Per riferimento futher, su MySQL 5+:

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

Cancellerà qualsiasi orp su TBL1 utilizzando fld come join.

GL Paulo Bueno

Problemi correlati