Eliminazione di righe con MySQL LEFT JOIN


186

Ho due tabelle, una per le scadenze, una per descrivere un lavoro. Ogni lavoro può assumere uno stato e alcuni stati indicano che le scadenze dei lavori devono essere eliminate dall'altra tabella.

Posso facilmente SELECTi lavori / le scadenze che soddisfano 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'

( statusappartiene alla jobtabella 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'

L'errore MySQL non dice nulla:

Si è verificato un errore nella sintassi SQL; controlla il manuale corrispondente alla versione del tuo server MySQL per la sintassi corretta da usare vicino a 'SINISTRA ISCRIVITI jobdeadline.job_id = job.job_id DOVE status=' szaml 'alla riga 1

Come posso trasformare il mio SELECTin una DELETEquery funzionante ?

Risposte:


335

Devi semplicemente specificare su quali tabelle applicare DELETE.

Elimina solo le deadlinerighe:

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

Elimina le righe deadlinee job:

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

Elimina solo le jobrighe:

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

4
Con "AS" ho dovuto usare l'alias nella mia clausola per farlo funzionare per il mio scopo (elimina gli orfani): ELIMINA t1 DA tabella1 AS t1 SINISTRA UNISCONO t2 AS t2 ON t1.uid = t2.result DOVE t2.result È NULL
Urs,

È interessante notare che il mio programma di controllo della sintassi PHPMyAdmin 4.5.1 non avrebbe accettato nulla tra DELETEe FROM, ma la query è andata bene comunque quando ho premuto Go.
clayRay

38

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

Nell'esempio, elimino 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

4
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 se quel tipo di sottoquery funzioni in MySQL, ma provalo. Suppongo che tu abbia una colonna ID nella tabella delle scadenze.


1
OP deve ancora specificare cosa DELETEdeve rendere inequivocabile la query. L'uso Incon le subquery rende tutto molto più lento. È meglio evitarlo.
Ian Atkin,

Nessuna tabella menzionata tra DELETEe FROM.
Istiaque Ahmed,

1

Prova questo:

DELETE `deadline`
FROM `deadline`
INNER JOIN `job` ON `deadline`.`job_id` = `job`.`id`
WHERE `job`.`id` = 123

1

MySQL consente di utilizzare la clausola INNER JOIN nell'istruzione DELETE per eliminare le righe da una tabella e le righe corrispondenti in un'altra tabella.

Ad esempio, per eliminare le righe da entrambe le tabelle T1 e T2 che soddisfano una condizione specificata, utilizzare la seguente istruzione:

DELETE T1, T2
FROM T1
INNER JOIN T2 ON T1.key = T2.key
WHERE condition;

Si noti che si inseriscono i nomi di tabella T1 e T2 tra le parole chiave DELETE e FROM. Se si omette la tabella T1, l'istruzione DELETE elimina solo le righe nella tabella T2. Allo stesso modo, se si omette la tabella T2, l'istruzione DELETE eliminerà solo le righe nella tabella T1.

Spero che questo aiuto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.