Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes 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> | ||