Arcy Posté(e) le 20 juin 2014 Partager Posté(e) le 20 juin 2014 Bonjour, Oui, je n'aime pas faire comme tout le monde ! Je dispose de deux bases de données et je dois récupérer le contenu de certains colonnes provenant de plusieurs tables. J'ai vu sur le net ceci : UPDATE ADHERENT SET ADHERENT.CODE = ADHERENT_PROV.CODE, ADHERENT.col1 = ADHERENT_PROV.col1 FROM ADHERENT INNER JOIN ADHERENT_PROV ON ADHERENT.CODE = ADHERENT_PROV.CODE Source Je l'ai donc adapté pour mon cas : UPDATE stockSET BASE1.stock.IDstock = BASE2.produits.ID, BASE1.stock.actu = BASE2.produits.actu, BASE1.stock.mini = BASE2.stockniv.mini, BASE1.stock.categorie = BASE2.produits.categorieFROM (((BASE2.produits INNER JOIN BASE1.stock ON BASE2.produits.ID = BASE1.stock.IDstock)INNER JOIN BASE2.stock ON BASE2.stock.ID = BASE2.produits.ID)INNER JOIN BASE2.stockniv ON BASE2.stockniv.ID= BASE2.produits.ID)) Mais j'obtiens : #1064 - Erreur de syntaxe près de 'FROM (((BASE2.produits INNER JOIN BASE1.stock ON BASE2.produits.ID = BASE1 à la ligne 6 Quelqu'un voit d'où pourrait venir le problème ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
refuznik Posté(e) le 20 juin 2014 Partager Posté(e) le 20 juin 2014 Tu n'aurais pas un problème de parenthèse tout simplement Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 20 juin 2014 Auteur Partager Posté(e) le 20 juin 2014 Euh ... phoque Bon, pour ma défense, ce n'est pas exactement la requête que j'ai, elle était trop longue et mal présentée, mais je vérifierai cette hypothèse. Sinon ce genre de requête est possible (sous cette forme là j'entends) ? Lien vers le commentaire Partager sur d’autres sites More sharing options...
RFN Posté(e) le 21 juin 2014 Partager Posté(e) le 21 juin 2014 Oui, c'est possible. Par contre : SET BASE1.stock.IDstock = BASE2.produits.ID ne fera rien car c'est justement la première clause de jointure Je suis pas un grand spécialiste mais ce SET me semble inutile. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 21 juin 2014 Auteur Partager Posté(e) le 21 juin 2014 Oui mais pour un UPDATE, on est bien censé dire que le contenu d'un champ est égal à un autre, non ? Et là, je veux copier le contenu de BASE2.produits.ID dans BASE1.stock.IDstock ... Lien vers le commentaire Partager sur d’autres sites More sharing options...
RFN Posté(e) le 21 juin 2014 Partager Posté(e) le 21 juin 2014 J'ai rien dit : ma remarque n'a pas lieu d'être... Tu as essayé : UPDATE BASE1.stockSET BASE1.stock.IDstock = BASE2.produits.ID, BASE1.stock.actu = BASE2.produits.actu, BASE1.stock.mini = BASE2.stockniv.mini, BASE1.stock.categorie = BASE2.produits.categorieFROM BASE2.produits INNER JOIN BASE1.stock ON BASE2.produits.ID = BASE1.stock.IDstockINNER JOIN BASE2.stock ON BASE2.stock.ID = BASE2.produits.IDINNER JOIN BASE2.stockniv ON BASE2.stockniv.ID= BASE2.produits.ID Lien vers le commentaire Partager sur d’autres sites More sharing options...
BreizFenrir Posté(e) le 21 juin 2014 Partager Posté(e) le 21 juin 2014 Il n'y a pas de clause FROM dans une requête UPDATE (voir documentation), en tout cas chez MySQL (peut-être d'autres SGBD les autorisent). Sur la base de ce qui est décrit dans la documentation (qu'il est utile de toujours garder à portée), quelque chose comme ce qui suit devrait passer. UPDATE `BASE1`.`stock` AS `stk1` INNER JOIN `BASE2`.`produits` ON `produits`.`ID` = `stk1`.`IDstock` INNER JOIN `BASE2`.`stockniv` ON `stockniv`.`ID` = `produits`.`ID`SET `stk1`.`actu` = `produits`.`actu`, `stk1`.`mini` = `stockniv`.`mini`, `stk1`.`categorie` = `produits`.`categorie` J'y ai dégagé la jointure avec la table stock de BASE2 étant donné qu'elle ne servait dans l'exemple à rien, de même que pour l'affectation inutile relevée par RFN. Ça ne change rien de toute manière à la façon de construire la requête. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 21 juin 2014 Auteur Partager Posté(e) le 21 juin 2014 Ok merci, j'essayerai cette méthode. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 23 juin 2014 Auteur Partager Posté(e) le 23 juin 2014 Bon finalement j'ai fait mon test et non, les données de l'autre base ne sont pas mises à jour ... Ma requête : UPDATE (((mmm.products INNER JOIN mym_sql.gestionstock ON mmm.products.ID = mym_sql.gestionstock.IDstock) INNER JOIN mmm.stockcurrent ON mmm.stockcurrent.product = mmm.products.ID) INNER JOIN mmm.stocklevel ON mmm.stocklevel.product = mmm.products.ID) SET mmm.stockcurrent.units = mym_sql.gestionstock.stockActuel, mmm.stocklevel.stocksecurity = mym_sql.gestionstock.stockMini WHERE mmm.products.ID = mym_sql.gestionstock.IDstock Lien vers le commentaire Partager sur d’autres sites More sharing options...
BreizFenrir Posté(e) le 24 juin 2014 Partager Posté(e) le 24 juin 2014 Dans ta requête UPDATE, tu as deux fois mmm.products.ID = mym_sql.gestionstock.IDstock, en tant que condition de jointure et dans ta clause WHERE. Mais hormis le fait d'être inutile (il suffit de l'avoir une seule fois, de préférence en condition de jointure pour des raisons de performances), ça ne devrait pas avoir d'impact sur le résultat de ta requête. Sur le coup, je sèche. Si tu construits une requête SELECT avec les mêmes conditions de jointures et que tu affiches les champs qui t'intéressent (ceux contenant les valeurs à écraser et ceux contenant les valeurs à récupérer) et les identifiants de ta ou tes tables à mettre à jour (pour servir de point de repère), est-ce que ça te retourne bien des enregistrements avec le contenu attendu ? Je proposerais bien aussi d'éclater ta requête en plusieurs de manière à ne modifier qu'une seule table à la fois (dans la mesure où le résultat prend la forme de requêtes plus simples ; si ça n'est pas le cas, oublie). Le risque par contre, c'est d'avoir la base dans un état impropre entre l'exécution des deux requêtes (et c'est là qu'on est content quand on peut utiliser des transactions). Lien vers le commentaire Partager sur d’autres sites More sharing options...
Arcy Posté(e) le 24 juin 2014 Auteur Partager Posté(e) le 24 juin 2014 En fait, il m'a juste fallu enlever la clause WHERE. Voilà le résultat final : UPDATE (((mmm.products INNER JOIN mym_sql.gestionstock ON mmm.products.ID = mym_sql.gestionstock.IDstock) LEFT JOIN mmm.stockcurrent ON mmm.stockcurrent.product = mmm.products.ID) LEFT JOIN mmm.stocklevel ON mmm.stocklevel.product = mmm.products.ID) SET mym_sql.gestionstock.stockActuel = mmm.stockcurrent.units, mym_sql.gestionstock.stockMini = mmm.stocklevel.stocksecurity Merci pour votre patience à tous Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.