2011-02-01 3 views
1

J'ai fait un JOIN similaire dans un script UPDATE, mais j'ai utilisé la même table dans la clause SET et WHERE. Dans ce script DELETE, j'ai besoin de supprimer d'une table où une condition est vraie dans une autre table. Par exemple:La table de la clause FROM doit-elle figurer dans la clause WHERE?

DELETE FROM `db_A`.`table_A` 
JOIN `db_B`.`table_B` 
ON `table_A`.`id` = `table_B`.`id` 
WHERE `table_B`.`name` = 'Remove Me' 

Puis-je faire quelque chose comme ça?

+1

... Avez-vous l'essayer? –

Répondre

0

De Delete Manual, la table que vous souhaitez supprimer va entre DELETE et FROM. À moins que vous souhaitez supprimer de toutes les tables impliquées dans la jointure

DELETE `db_A`.`table_A` FROM `db_A`.`table_A` 
JOIN `db_B`.`table_B` 
ON `table_A`.`id` = `table_B`.`id` 
WHERE `table_B`.`name` = 'Remove Me' 
1

Le MYSQL documentation est très clair que oui, vous pouvez le faire

Vous pouvez spécifier plusieurs tables dans une instruction DELETE pour supprimer des lignes à partir de une ou plusieurs tables en fonction de la condition particulière dans la clause WHERE . Cependant, vous ne pouvez pas utiliser ORDER BY ou LIMIT dans une table multiple DELETE. La clause table_references répertorie les tables impliquées dans la jointure. Sa syntaxe est décrite dans la section 12.2.8.1, "JOIN Syntax". Pour la première syntaxe à tables multiples, , seules les lignes correspondantes des tables répertoriées avant la clause FROM sont supprimées . Pour la deuxième syntaxe de plusieurs tables, seules les lignes correspondantes des tables répertoriées dans la clause FROM (avant la clause USING) sont supprimées. L'effet est que vous pouvez supprimer des lignes de plusieurs tables en même temps et ont des tables supplémentaires qui sont utilisés seulement pour la recherche:

DELETE t1, t2 FROM t1 INNER JOIN t2 INNER JOIN t3 
WHERE t1.id=t2.id AND t2.id=t3.id; 

Ou:

DELETE FROM t1, t2 USING t1 INNER JOIN t2 INNER JOIN t3 
WHERE t1.id=t2.id AND t2.id=t3.id; 

Ces instructions utilisent les trois tables lors de la recherche de lignes à supprimer, mais supprimer les lignes correspondantes uniquement à partir des tables t1 et t2.

Les exemples précédents utilisent INNER JOIN, mais plusieurs tables DELETE peuvent utiliser d'autres types de jointures autorisées dans les commandes SELECT, telles que GAUCHE JOIN. Par exemple, pour supprimer les lignes qui existent dans t1 qui ont pas de correspondance dans t2, utilisation LEFT JOIN:

DELETE t1 FROM t1 LEFT JOIN t2 ON t1.id=t2.id WHERE t2.id IS NULL; 
The syntax permits .* after each tbl_name for compatibility with Access. 
0

En réponse générale, oui. Vous pouvez joindre à la deuxième table avec la condition, comme vous l'avez indiqué, ou tirer les ids dans une sous-commande, comme:

SUPPRIMER DE T1 OERE id dans (SELECT ID DE T1 JOIN T2 ON X = O OERE T2 .Val = "X")

C'est un peu de poids lourd, mais si T2 est l'enfant, vous pouvez réduire à:

(SELECT Y du T2 WHERE Val = "X")

Avoir du sens?