[Résolu / SQL] Update avec select ?

Update avec select ? [Résolu / SQL] - SQL/NoSQL - Programmation

Marsh Posté le 18-08-2006 à 11:12:33    

Bonjour à tous, j'ai le nez dans mon bouquin depuis trop longtemps alors je me suis décidé à écrire ce message pour expliquer mon souci (défi ?) ...  
 
Sur la même table B2, je dois mettre à jour deux champs B2_C30 et B2_C31. Ces deux champs sont calculés à partir de B2_C18. En clair :
 
On fait un select où je récupère la clé B2_C1 et B2_C2 et deux colonnes calculées NUMP et SUFP.
 

Code :
  1. SELECT B2_C1, B2_C2, RTRIM(B2_C18, 'abcde') AS NUMP, LTRIM(B2_C18, '0123456789') AS SUFP
  2. FROM B2


 
Ensuite, je veux donc faire mon update qui serait du genre :
 

Code :
  1. UPDATE B2 SET B2_C30 = (NUMP), B2_C31 = (SUFP) WHERE (LES NUPLETS QUE J'AI RECUP AVEC MON SELECT)


 
Voilà ... Je pense que c'est possible mais je dois avoir des lacunes de syntaxe ou de façon de faire ... Quelqu'un peut m'aider ?
@ bientôt.


Message édité par Profil supprimé le 18-08-2006 à 12:13:23
Reply

Marsh Posté le 18-08-2006 à 11:12:33   

Reply

Marsh Posté le 18-08-2006 à 11:21:25    

Faut que tu passes par une sous requete,
avec un where exists ca doit le faire tout dépend de ton sgbd

Reply

Marsh Posté le 18-08-2006 à 11:26:10    

Du genre un SELECT dans ma clause WHERE de mon UPDATE ..? J'ai Oracle ca ne devrait pas poser de souci mais je vais avoir un problème de syntaxe ...

Reply

Marsh Posté le 18-08-2006 à 11:33:57    

Si Oracle pas de prob
Quel est le lien exact entre tes deux requetes Update et Select ?
 
Essai de passer dans un premier temps par un select et sous requete.
 
Exemple
 
select B2_C30, B2_C31 from B2 a where exists (select 1 from B2 B
where a.B2_C1 = b.B2_C1...
 
Enfin la jointure que tu dois faire entre la première requete qui te ramène les résultats et la deuxième qui te donne les ligne à mettre à jour

Reply

Marsh Posté le 18-08-2006 à 11:36:01    

En fait j'ai du mal à voir la jointure,  
 
"WHERE (LES NUPLETS QUE J'AI RECUP AVEC MON SELECT) "
 
c'est ta clé primaire ?
 
Pour une ligne à mettre à jour, les champs à updater dépendent d'un champ de la même ligne ?

Reply

Marsh Posté le 18-08-2006 à 11:40:34    

Ma clé primaire est le couple B2_C1, B2_C2.
Ce que j'aimerais faire en fait, c'est de mettre à jour (sur toutes les lignes de ma table) mes deux attributs B2_C30 et B2_C31 grâce à B2_C18
 
En fait B2_C30 et B2_C31 sont calculés à partir de B2_C18 (pour simplifier partie gauche et partie droite d'une chaine de caractères ...)

Reply

Marsh Posté le 18-08-2006 à 11:46:30    


 
Si c'est sur la même ligne pas besoin de sous requete tu fais directement l'update
 
update b2 set b2_c30=RTRIM(B2_C18, 'abcde'), b2_C31 = LTRIM(B2_C18, '0123456789')

Reply

Marsh Posté le 18-08-2006 à 12:03:43    

Je regarde ça ... Je pense qu'il va falloir que je fasse une clause where à ton update pour ciblé les enregistrements ...

Reply

Marsh Posté le 18-08-2006 à 12:06:57    

Il prend réellement le B2_C18 de la ligne courante ??? j'ai du mal à imaginer car pour utiliser B2_C18, il faudrait le selectionner quelque part ...

Reply

Marsh Posté le 18-08-2006 à 12:12:34    

Mais lol ça marche (J'ai Oracle 9i)
 

Code :
  1. UPDATE B2 SET B2_C30=RTRIM(B2_C18, 'bisterquan'), B2_C31=LTRIM(B2_C18, '0123456789')


 
L'UPDATE n'a pas de clause WHERE donc la mise à jour sera faite sur tous les nuplets de la table B2. B2_C18 est utilisé pour contruire les deux autres champs et en fait le SGBD prend bien le B2_C18 "courant" de la ligne qui est en train d'être mise à jour. Donc ... Bah ... merci à toi dlaumor ^_^

Reply

Marsh Posté le 18-08-2006 à 12:12:34   

Reply

Marsh Posté le 18-08-2006 à 12:15:01    

oui il prend celui de la ligne courante.
 
Tu peux mettre un where si tu ne veux pas updater toute les lignes mais filtrer sur certaines seulement.

Reply

Marsh Posté le 18-08-2006 à 12:16:07    

De rien ;)

Reply

Sujets relatifs:

Leave a Replay

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