Jump to content

UPDATE multi-colonne avec plusieurs sources


Recommended Posts

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 ?

Link to comment
Share on other 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) ?

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 ...

Link to comment
Share on other 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

Link to comment
Share on other 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.

Link to comment
Share on other 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
Link to comment
Share on other 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).

Link to comment
Share on other 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:

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...