Probleme requete UPDATE [Résolu/Fermé]

Signaler
Messages postés
23
Date d'inscription
mercredi 10 octobre 2012
Statut
Membre
Dernière intervention
8 mai 2015
-
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
-
Bonjour,

Je me permet de faire appel à votre aide pour un problème de rédaction de requête UPDATE sur laquelle je bosse depuis plus d'une semaine.

J'ai une table (MaTable) contenant une liste de produits, les emballages et les clients qui leurs sont associés. Un même produit peut être envoyé à plusieurs clients, dans plusieurs emballages différents, et un même client peut avoir plusieurs emballages en fonction des produits.

Je souhaite écrire une requête qui va interroger MaTable, trouver le Client2, rechercher l'emballage du Client1 et le copier sur le Client2 .

Voilà ce que j'ai rédiger. Mais comme je m'y connais peu en UPDATE, je souhaite savoir si ma requête est bien rédigé, et si elle aura le résultat attendu.

UPDATE MaTable
SET Emballage = (SELECT MaTable.Emballage
FROM MaTable
WHERE MaTable.Client LIKE ('Client1'))
WHERE MaTable.Client LIKE Client2

Merci pour votre aide



4 réponses

Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
211
salut,

UPDATE MaTable 
SET Emballage = (SELECT MaTable.Emballage
FROM MaTable
WHERE MaTable.Client LIKE ('Client1'))
WHERE MaTable.Client LIKE Client2

tu mets 'Client1' entre guillemets vu que c'est une chaine, mais pas 'Client2'. Donc soit Client2 est une colonne de ta table, soit c'est un faute ^^.
De même, les parenthèse autour de 'Client1' sont inutiles.
Ensuite, le like ici est inutile aussi car tu recherche la chaine exacte.
Enfin, tu déclare deux fois la même table sans alias donc ca ne fonctionnera pas.
Donc écris plutôt :

UPDATE MaTable
SET Emballage = (SELECT MaTable.Emballage
FROM MaTable T2
WHERE T2.Client = 'Client1')
WHERE MaTable.Client = 'Client2'

J'éspère aussi qu'une ligne client est unique, sinon tu auras une erreur. De ce que j'ai lu, tu aura probablement le cas, donc il faudrai aussi que tu prennes en compte le produit car, à priori, c'est l'association produit/emballage/client qui est unique (mais il faudra que tu le confirme).

Pour ma part j'aurai plutot fais une requête comme celle ci :



UPDATE Matable T1 , MaTable T2
SET T1.Emballage = T2.Emballage
WHERE T1.Client = 'Client1'
and T2.Client = 'Client2'
AND T1.Produit = T2.Produit


naga
Messages postés
23
Date d'inscription
mercredi 10 octobre 2012
Statut
Membre
Dernière intervention
8 mai 2015

Bonjour,

Merci nagashima pour ta réponse.

Je te remercie également pour l'analyse de ma requête maladroite. J'ai appris le sql sur le tard dans les bouquins et sur les sites et forums d'entraide.

Comme tu l'as compris client2 n'est pas une colonne mais une chaîne. De plus, c'est bien l'association produit/emballage/client qui est unique (un produit peut avoir plusieurs emballages et plusieurs clients associés. Un client peut avoir plusieurs produits et emballages. Un produit peut également avoir plusieurs emballages pour un même client.)

Ce que je cherche , c'est récupérer les valeurs d'un produit pour un client spécifiques (ici client1) et les copier produits par produits sur le client2.

Pour être clair, tout se trouve dans une seule et même table.

Enfin, je ne comprends pas très bien la requête que tu me conseilles.

Sissou
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
211
salut ,
et bien en fait, dans la requête :

UPDATE Matable T1 , MaTable T2
SET T1.Emballage = T2.Emballage
WHERE T1.Client = 'Client1'
and T2.Client = 'Client2'
AND T1.Produit = T2.Produit

je déclare deux fois la table de manière à mettre à jour un élément de cette table pour elle même.

C'est à dire, si tu fais cette requête ci :


SELECT T1.Emballage as oldemballage, T2.Emballage as newemballage
from Matable T1 , MaTable T2
WHERE T1.Client = 'Client1'
and T2.Client = 'Client2'
AND T1.Produit = T2.Produit

tu récupère le code emballage actuel pour le client1 et le code emballage du client2 que l'on souhaite mettre sur le client1.

Donc, lors de mon 'update', je lui dis simplement que quand un produit du Client1 existe pour le Client 2, on met à jours l'emballage du client 1 pour le client 2.
Messages postés
23
Date d'inscription
mercredi 10 octobre 2012
Statut
Membre
Dernière intervention
8 mai 2015

Salut,

Si j'ai bien compris :

UPDATE Matable T1, MaTable T2
SET T1.Emballage = T2.Emballage
SET T1.QuantitéDansUnEmballage = T2.QuantiteDansUnEmballage
WHERE T1.Client = 'Client1'
AND T2.Client = 'Client2'
AND T1.Produit = T2.Produit

me permet de mettre à jour 2 colonnes ?
(Produit/Emballage/QuantitéDansUnEmballage/Client)
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
211
c'est presque ca :



SET T1.Emballage = T2.Emballage
, T1.QuantitéDansUnEmballage = T2.QuantiteDansUnEmballage

il seul set, chaque colonne à mettre à jours séparé par une virgule.
Messages postés
23
Date d'inscription
mercredi 10 octobre 2012
Statut
Membre
Dernière intervention
8 mai 2015

Je te remercie,

Je vais essayer cette requête.

Encore merci pour ton aide, tes corrections et tes conseils.

Je marque ce poste comme résolu.
Messages postés
4270
Date d'inscription
samedi 8 septembre 2007
Statut
Membre
Dernière intervention
4 mars 2021
211
pas de soucis, bon dev =)
naga