Problème DELETE en sql
Nagra
-
cchristian Messages postés 928 Statut Membre -
cchristian Messages postés 928 Statut Membre -
Bonjour tout le monde!
Je post ce message parce que j'ai un problème avec une requete SQL de type DELETE et je ne comprend pas d'où vient le problème
Voilà donc la requête:
DELETE
FROM TempsTestCommande
WHERE (NomSequence, DateHeureSequence, PositionAPDU) NOT IN
(
SELECT DISTINCT SA.NomSequence, SA.DateHeureSequence, SA.PositionAPDU
FROM Sequence_APDU SA, TempsTestCommande TTC
WHERE SA.NomSequence = TTC.NomSequence
AND SA.DateHeureSequence = TTC.DateHeureSequence
AND SA.PositionAPDU = TTC.PositionAPDU
AND SA.NomSequence IS NOT NULL
AND SA.DateHeureSequence IS NOT NULL
AND SA.PositionAPDU IS NOT NULL
);
Lorsque je remplace le DELETE par un SELECT *, pas de problèmes, je récupère bien les résultats voulus. Seulement là ça ne marche pas et je ne comprend pas où se trouve le problème. L'erreur est la suivante:
You can't specify target table 'TempsTestCommande' for update in FROM clause
Si quelqu'un sait ou se trouve l'erreur je l'en remercie d'avance.
Bonne journée à tous :)
Je post ce message parce que j'ai un problème avec une requete SQL de type DELETE et je ne comprend pas d'où vient le problème
Voilà donc la requête:
DELETE
FROM TempsTestCommande
WHERE (NomSequence, DateHeureSequence, PositionAPDU) NOT IN
(
SELECT DISTINCT SA.NomSequence, SA.DateHeureSequence, SA.PositionAPDU
FROM Sequence_APDU SA, TempsTestCommande TTC
WHERE SA.NomSequence = TTC.NomSequence
AND SA.DateHeureSequence = TTC.DateHeureSequence
AND SA.PositionAPDU = TTC.PositionAPDU
AND SA.NomSequence IS NOT NULL
AND SA.DateHeureSequence IS NOT NULL
AND SA.PositionAPDU IS NOT NULL
);
Lorsque je remplace le DELETE par un SELECT *, pas de problèmes, je récupère bien les résultats voulus. Seulement là ça ne marche pas et je ne comprend pas où se trouve le problème. L'erreur est la suivante:
You can't specify target table 'TempsTestCommande' for update in FROM clause
Si quelqu'un sait ou se trouve l'erreur je l'en remercie d'avance.
Bonne journée à tous :)
A voir également:
- Problème DELETE en sql
- Hiberfil.sys delete - Guide
- Just delete me - Guide
- Logiciel sql - Télécharger - Bases de données
- Sql (+) - Forum Programmation
- Requete sql pix - Forum PHP
3 réponses
Bonjour,
Le problème est certainement lié au fait qu'une même table "TempsTestCommande" est utilisée à la fois comme une des tables de référence pour effectuer la recherche (NOT IN) et comme une table mise à jour (avec DELETE) et ce dans la même requête SQL.
Le problème est certainement lié au fait qu'une même table "TempsTestCommande" est utilisée à la fois comme une des tables de référence pour effectuer la recherche (NOT IN) et comme une table mise à jour (avec DELETE) et ce dans la même requête SQL.
Salut! Merci de ta réponse :)
En effet, je me demandais si le problème de venait pas de là. Apparemment en faisant des recherches sur le numéro de l'erreur, il semble que MySQL ne gère pas ce genre de cas contrairement à d'autres SQBD.
Pour contourner le problèmes j'ai récupéré les résultats de la version avec le SELECT dans un vecteur Java (mon programme est écrit dans ce langage) et j'ai fais un DELETE sur chacune des lignes. C'est plus long et pas super propre mais je ne vois pas 36 autres solutions en fait. A l'arrivée mon programme lag un petit peu étant donné que je récupère quand même dans les 20.000 lignes avec cette méthode. Mais c'est mieux que rien et, de toutes manières, comme il s'agit de l'outil de maintenance de mon programme qui est sensé être exécuté tous les soirs, c'est pas bien grave qu'il prenne 1 minute à tout analyser alors qu'il pourrait prendre seulement 10 secondes :)
En tous cas merci de ta réponse!
Bonne soirée ++
En effet, je me demandais si le problème de venait pas de là. Apparemment en faisant des recherches sur le numéro de l'erreur, il semble que MySQL ne gère pas ce genre de cas contrairement à d'autres SQBD.
Pour contourner le problèmes j'ai récupéré les résultats de la version avec le SELECT dans un vecteur Java (mon programme est écrit dans ce langage) et j'ai fais un DELETE sur chacune des lignes. C'est plus long et pas super propre mais je ne vois pas 36 autres solutions en fait. A l'arrivée mon programme lag un petit peu étant donné que je récupère quand même dans les 20.000 lignes avec cette méthode. Mais c'est mieux que rien et, de toutes manières, comme il s'agit de l'outil de maintenance de mon programme qui est sensé être exécuté tous les soirs, c'est pas bien grave qu'il prenne 1 minute à tout analyser alors qu'il pourrait prendre seulement 10 secondes :)
En tous cas merci de ta réponse!
Bonne soirée ++