2010-05-04 19 views
143

Ho due tabelle, una per le scadenze di lavoro, una per descrivere un lavoro. Ogni lavoro può assumere uno stato e alcuni stati significa che le scadenze dei lavori devono essere cancellate dall'altra tabella.Eliminazione di righe con MySQL LEFT JOIN

posso facilmente SELECT i lavori/scadenze che soddisfa i miei criteri con un LEFT JOIN:

SELECT * FROM `deadline` 
LEFT JOIN `job` ON deadline.job_id = job.job_id 
WHERE `status` = 'szamlazva' 
OR `status` = 'szamlazhato' 
OR `status` = 'fizetve' 
OR `status` = 'szallitva' 
OR `status` = 'storno' 

(status appartiene job tavolo non deadline)

Ma quando mi piacerebbe eliminare queste righe da deadline, MySQL genera un errore. La mia domanda è:

DELETE FROM `deadline` 
LEFT JOIN `job` 
ON deadline.job_id = job.job_id 
WHERE `status` = 'szamlazva' 
OR `status` = 'szamlazhato' 
OR `status` = 'fizetve' 
OR `status` = 'szallitva' 
OR `status` = 'storno' 

errore MySQL non dice nulla:

Hai un errore nella sintassi SQL; controllare il manuale che corrisponde alla versione del server MySQL per la sintassi diritto di utilizzare vicino a 'LEFT JOIN job ON deadline.job_id = job.job_id WHERE status = 'szaml' at line 1

Come posso trasformare il mio SELECT in una query di lavoro DELETE?

risposta

260

È sufficiente specificare su quali tabelle applicare lo DELETE.

eliminare solo i deadline righe:

DELETE `deadline` FROM `deadline` LEFT JOIN `job` .... 

eliminare il deadline e job righe:

DELETE `deadline`, `job` FROM `deadline` LEFT JOIN `job` .... 

eliminare solo i job righe:

DELETE `job` FROM `deadline` LEFT JOIN `job` .... 
+5

Utilizzare anche "status in ('szamlazva', 'szamlazhato', 'fizetve', .........)" – Salil

+3

Con "AS" ho dovuto usare l'alias nella mia clausola per farlo funzionare per il mio scopo (delete orfani): dELETE FROM tabella1 t1 AS t1 LEFT JOIN t2 t2 ON t1.uid = t2.result WHERE IS NULL t2.result – Urs

+0

Riferimento: http://dev.mysql.com/doc/ refman/5.7/it/delete.html – Slawa

1
DELETE FROM deadline where ID IN (
    SELECT d.ID FROM `deadline` d LEFT JOIN `job` ON deadline.job_id = job.job_id WHERE `status` = 'szamlazva' OR `status` = 'szamlazhato' OR `status` = 'fizetve' OR `status` = 'szallitva' OR `status` = 'storno'); 

Non sono sicuro che questo tipo di query secondaria funzioni in MySQL, ma provalo. Suppongo che tu abbia una colonna ID nella tabella delle scadenze.

+1

OP ha ancora bisogno di specificare cosa "CANCELLARE" per rendere la query non ambigua. Usare 'In' con sottoquery rende tutto molto più lento. È meglio evitare. –

+0

Nessuna tabella tra "DELETE" e "FROM". –

25

Se si utilizza "tavolo come ", quindi specificarlo per eliminare.

Nell'esempio si eliminano tutte le righe table_1 che non esistono in table_2.

DELETE t1 FROM `table_1` t1 LEFT JOIN `table_2` t2 ON t1.`id` = t2.`id` WHERE t2.`id` IS NULL 
+0

@Roman Losev - Qual è il punto di WHERE 1 – vmanta

+0

È il mio metodo di selezione predefinito ... Ci dispiace, per quello. Hai dimenticato di cancellare. Post modificato –