Aller au contenu

UPDATE multi-colonne avec plusieurs sources


Arcy

Messages recommandés

Bonjour,

Oui, je n'aime pas faire comme tout le monde ! :transpi:

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

Euh ... phoque :transpi:

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

J'ai rien dit : ma remarque n'a pas lieu d'être...


Tu as essayé :

UPDATE BASE1.stock
SET BASE1.stock.IDstock = BASE2.produits.ID, BASE1.stock.actu = BASE2.produits.actu, BASE1.stock.mini = BASE2.stockniv.mini, BASE1.stock.categorie = BASE2.produits.categorie
FROM 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

Lien vers le commentaire
Partager sur d’autres sites

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

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

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

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 :merci:

:inpactitude:

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...