[Résolu] Souci sur code SQL

Souci sur code SQL [Résolu] - SQL/NoSQL - Programmation

Marsh Posté le 28-06-2021 à 14:33:48    

Bonjour,
 
Pour faire simple, j'ai besoin d'aide pour un code en SQL.
Je possède des connaissances assez sommaires sur ce domaine, et je ne parviens pas à avoir le comportement souhaité.
En gros j'ai deux tables : Datastore et Directory, les entrées Directory sont join avec une entrée dans Datastore (un Datastore peut avoir plusieurs Directory).
 
Je souhaiterais changer le contenus d'une colonne nommé "Status" sur tout les directory liès à un Datastore quand un Datastore est mis à jour.
 
Actuellement j'ai un code qui marche à moitié, car il ne fait ce changement que sur un seul directory à chaque changement, avez-cous une idée de pourquoi ?
 
Mon code :

Code :
  1. UPDATE Directory
  2. Set status = 0
  3. WHERE Directory.Id = (
  4.     SELECT Directory.Id
  5.     FROM Directory
  6.     INNER JOIN Datastore ON Directory.Id_Datastore = Datastore.Id
  7.     WHERE
  8.         Directory.Status <> Datastore.Status
  9.     AND
  10.         Datastore.Status = 0
  11.     );

 
 
En vous remerciant d'avance,
Cordialement


Message édité par darkwolf3917 le 29-06-2021 à 15:57:29
Reply

Marsh Posté le 28-06-2021 à 14:33:48   

Reply

Marsh Posté le 28-06-2021 à 16:36:09    

Code :
  1. UPDATE Directory
  2. SET status = 0
  3. WHERE Directory.Id_Datastore = Datastore.Id AND Datastore.Id = $IDDatastoreUpdated
  4. AND  Directory.Status <> Datastore.Status
  5. AND Datastore.Status = 0


 
$IDDatastoreUpdated contient l'ID du datastore qui vient d'être mis à jour. Ca devrait le faire je pense.
Après, ça dépend des possibilités de ton SGBD. Vu que c'est sur la MAJ d'un datastore, tu pourrais utiliser un trigger pour faire la MAJ ds Directories liés. ;)
 
Edit : tu devrais avoir sous peu une réponse en mode "pavé" pas forcément très compréhensible de notre nouvel ami djinto. Faut pas t'inquiéter, c'est normal, il est fan des topics de SQL. Il nous remonte même ceux enterrés depuis plusieurs années... :whistle:


Message édité par rufo le 28-06-2021 à 16:38:24

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-06-2021 à 16:55:36    

Bonjour Rufo,
 
Merci pour ton retour, mais du coup j'utilise déjà ce code dans un trigger, et du coup je n'est pas (ou ne connais pas ) de variable qui pourrais justement me donner l'ID du datastore qui à changé...
 
Mon SGBD est un sqlite3 ^^
 
Si tu à une autre idée du coup ça m'aiderais beaucoup, sinon je vais voir pour ajouter ce code au niveau de mes requettes en même temps que je change le status :)
 
Encore merci,
 
Cordialement

Reply

Marsh Posté le 28-06-2021 à 18:02:50    

Tu as forcément l'ID du datastore qui a été mis à jour en paramètre d'entrée de ton trigger.
Sinon, ne fait pas de trigger et traite cette MAJ au niveau du code de ton appli. Là, tu auras forcément l'ID du datastore qui a été mis à jour.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 29-06-2021 à 10:32:39    

j'ai essayé ce matin, et malheureusement ça ne fonctionne pas, j'ai cette erreur en retour (que ce soit dans un trigger ou dans une simple fenêtre SQL) :
 
[10:27:01] Erreur pendant l’exécution de la requête sur la base de données « internal » : no such column: Datastore.Id
 
Pourtant la table Datastore possède bien une colonne Id...
 
Je comprend pas du coup, je vais voir si je trouve une autre méthode mais je commence vraiment à sentir mes lacunes en SQL, après je suis pas du tout programmateur de base (je suis dans le système/réseaux) :/
 
Merci beaucoup ^^

Reply

Marsh Posté le 29-06-2021 à 10:39:47    

Peut-être que tu peux pas faire de jointure sur une autre table dans une requête de type UPDATE.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 29-06-2021 à 10:46:34    

Bon, j'ai finalement réussi en reprenant mon code initial et en faisant un (quantième) tour sur la doc.
j'ai remplacer le  

Code :
  1. WHERE Directory.Id = ( bla bla bla);


Par

Code :
  1. WHERE Directory.Id IN (bla bla bla);


et j'ai utiliser les variable de trigger pour retrouver mes Id et Status, du coup ça donne :

Code :
  1. UPDATE Directory
  2. Set status = new.Status
  3. WHERE Directory.Id IN (
  4.     SELECT Directory.Id
  5.     FROM Directory
  6.     INNER JOIN Datastore ON Directory.Id_Datastore = Datastore.Id
  7.     WHERE Directory.Status <> Datastore.Status
  8.     AND Datastore.Id = new.Id
  9.     );


 
Merci rufo pour la piste sur les variables dans les trigger, je pense que j'aurais encore tourné un moment dans le vent XD
 
Sujet fini, merci encore et bonne continuation :)
 
PS : je croit bien qu'il n'est pas possible de faire de jointure sans faire d'embriquement avec des ( ) en sqlite3 pour les UPDATE :/


Message édité par darkwolf3917 le 29-06-2021 à 10:48:27
Reply

Marsh Posté le 29-06-2021 à 11:45:26    

Content si tu as trouvé une solution :)
Mets "[Résolu]" en début du titre de ton topic en éditant le premier message de ton sujet.


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed