Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/10/2007, 18h37   #1
Membre régulier
 
Inscription : avril 2004
Messages : 284
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 284
Points : 75
Points : 75
Par défaut mettre à jour le champ d'une table en fonction de l'entité suivante ?

Bonjour,

J'ai une table :

ma_table
id INT AUTO_INCREMENT PRIMARY KEY,
valeur INT,
mon_bool BOOLEAN DEFAULT 0

Je voudrais parcourir l'ensemble des éléments de cette table et attribuer mon_bool = 1 si la valeur de l'id suivante est incrémentée par rapport à l'id courant et si la valeur est supérieure.

Concrétement (ça ne marche pas) :

Code :
1
2
3
4
5
UPTADE ma_table t1 
SET t1.mon_bool = 1 
WHERE (SELECT t2.valeur 
  FROM ma_table t2 
  WHERE t2.id = (t1.id +1) AND t2.valeur > t1.valeur);
J'ai une erreur d'impossibilité d'utiliser ma_table dans le FROM.

J'ai également pensé à un curseur, mais pour chaque valeur de ma_table parcourue, celle-ci est read only dans le curseur, je ne peux pas faire l'UPDATE.

Pouvez-vous m'aider là-dessus ?

En vous remerciant,

C. Tobini
ctobini est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2007, 22h24   #2
Rédacteur/Modérateur

 
Avatar de Antoun
 
Homme Antoine Dinimant
Consultant en Business Intelligence
Inscription : octobre 2006
Messages : 5 854
Détails du profil
Informations personnelles :
Nom : Homme Antoine Dinimant
Âge : 42
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : octobre 2006
Messages : 5 854
Points : 9 540
Points : 9 540
MySQL refuse de lire et d'écrire sur la même table. L'astuce consiste à ajouter un niveau de sous-requête dans le FROM, car MySQL implémente ces sous-requête par des tables temporaires (ce qui lève le refus ci-dessus).

Code :
1
2
3
4
5
UPTADE ma_table t1 
SET t1.mon_bool = 1 
WHERE (SELECT t2.valeur 
  FROM (select valeur from ma_table) t2 
  WHERE t2.id = (t1.id +1) AND t2.valeur > t1.valeur);
__________________
Antoun
Expert SQL, BO, Essbase

La bible d'Essbase est parue !
Antoun est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/10/2007, 17h36   #3
Membre régulier
 
Inscription : avril 2004
Messages : 284
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 284
Points : 75
Points : 75
Bonjour et merci de la réponse,

Pratique plutôt que faire une procédure avec curseurs, je vais expérimenter vite fait !

Bonne soirée,

C. Tobini
ctobini est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2007, 10h01   #4
Membre régulier
 
Inscription : avril 2004
Messages : 284
Détails du profil
Informations forums :
Inscription : avril 2004
Messages : 284
Points : 75
Points : 75
Et ben c'est parfait !

Merci encore et bonne journée,

C. Tobini
ctobini est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h45.


 
 
 
 
Partenaires

Hébergement Web