Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
tips_informatiques:bases_de_donnees:mysql:mysql [2012/09/12 16:26] nico |
tips_informatiques:bases_de_donnees:mysql:mysql [2013/08/06 11:37] (Version actuelle) nico |
||
---|---|---|---|
Ligne 181: | Ligne 181: | ||
END; | END; | ||
$$ | $$ | ||
+ | </code> | ||
+ | |||
+ | |||
+ | ====== DELETE avec sous-query ====== | ||
+ | |||
+ | __Soft__: MySQL Ver 5.0 | ||
+ | |||
+ | __Problème__: | ||
+ | |||
+ | Un DELETE avec une sous-query qui concerne la table dans laquelle des records doivent être effacés ne fonctionne pas directement. | ||
+ | |||
+ | Cette requête ne marche pas: | ||
+ | |||
+ | <code sql> | ||
+ | DELETE FROM bibliographies | ||
+ | WHERE bibliographies.id IN | ||
+ | ( | ||
+ | SELECT bibliographies.id | ||
+ | FROM bibliographies | ||
+ | WHERE document_id IN | ||
+ | ( | ||
+ | SELECT documents.id | ||
+ | FROM documents | ||
+ | WHERE document_subtype_id = 19 | ||
+ | ) | ||
+ | ) | ||
+ | </code> | ||
+ | |||
+ | L'erreur suivante est obtenue: //#1093 - You can't specify target table 'bibliographies' for update in FROM clause// | ||
+ | |||
+ | __Solution__: | ||
+ | |||
+ | Il suffit de rajouter un SELECT autour de la sous-query pour que la requête passe: | ||
+ | |||
+ | |||
+ | <code sql> | ||
+ | DELETE FROM bibliographies | ||
+ | WHERE bibliographies.id IN | ||
+ | ( | ||
+ | SELECT * FROM | ||
+ | ( | ||
+ | SELECT bibliographies.id | ||
+ | FROM bibliographies | ||
+ | WHERE document_id IN | ||
+ | ( | ||
+ | SELECT documents.id | ||
+ | FROM documents | ||
+ | WHERE document_subtype_id = 19 | ||
+ | ) | ||
+ | ) AS tmp | ||
+ | ) | ||
</code> | </code> | ||