web-dev-qa-db-fra.com

Supprimer d'une table avec jointure

J'essaie de supprimer des enregistrements d'une base de données en fonction des critères de sélection d'une autre. Nous avons deux tableaux, emailNotification qui stocke une liste d'emplois et d'e-mails. Ensuite, nous avons des emplois. Je veux effacer les notifications par courrier électronique pour les emplois qui ont été fermés. J'ai trouvé quelques exemples précédents sur Stackoverflow qui m'ont conduit à ce type de syntaxe (j'essayais auparavant de faire la jointure avant le où).

DELETE FROM emailNotification
WHERE notificationId IN (
 SELECT notificationId FROM emailNotification e
 LEFT JOIN jobs j ON j.jobId = e.jobId
WHERE j.active = 1
)

Je reçois l'erreur, vous ne pouvez pas spécifier la table cible 'emailNotication' pour la mise à jour dans la clause FROM.

33
Julian Young

Je ne suis pas sûr de vos besoins. Ce que j'ai compris de votre question, c'est que vous souhaitez supprimer tous les e-mails des emplois fermés. essaye celui-là;

DELETE e FROM emailNotification e 
LEFT JOIN jobs j ON j.jobId = e.jobId 
WHERE j.active = 1 AND CURDATE() < j.closeDate
86
Naved

Enregistrements DELETE MySQL avec JOIN

Supprimer plusieurs enregistrements de plusieurs tables à l'aide d'une seule requête est comme ci-dessous:

Vous utilisez généralement INNER JOIN dans l'instruction SELECT pour sélectionner des enregistrements d'une table qui ont des enregistrements correspondants dans d'autres tables. Nous pouvons également utiliser la clause INNER JOIN avec l'instruction DELETE pour supprimer les enregistrements d'une table et également les enregistrements correspondants dans d'autres tables, par exemple, pour supprimer les enregistrements des tables T1 et T2 qui remplissent une condition particulière, vous utilisez l'instruction suivante:

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

Notez que vous placez les noms de table T1 et T2 entre DELETE et FROM. Si vous omettez la table T1, l'instruction DELETE supprime uniquement les enregistrements de la table T2 et si vous omettez la table T2, seuls les enregistrements de la table T1 sont supprimés.

La condition de jointure T1.key = T2. key spécifie les enregistrements correspondants dans la table T2 qui doivent être supprimés.

La condition de la clause WHERE spécifie les enregistrements du T1 et du T2 qui doivent être supprimés.

8
Aman Garg

Vous pouvez essayer quelque chose comme ceci:

DELETE FROM emailNotification
WHERE jobId IN (
 SELECT jobId FROM jobs j
 WHERE j.active = 1
)
4
Patrick McDonald

Si l'objectif est de supprimer des lignes correspondantes, comme la suppression de lignes dans le 1er tableau qui ont des relations dans le 2ème, pour éviter de supprimer le 1er tableau entier, vous devez mettre une condition supplémentaire "où" pour le 2ème tableau

DELETE f FROM firsttable f 
LEFT JOIN secondtable s ON f.related_id = .jobId 
WHERE s.related_id
1
Mahmut Gulerce