Page 1 sur 1

Update sql avec conditions

Posté : 16 oct. 2008, 13:46
par sebhades
Bonjour,

Je suis un peu rouillé en SQL alors je viens chercher un peu d'aide.
SGBD = Oracle 10

(je n'ai pas mis de create table vu que j'ai schématisé le code)
Voilà le code simplifié de départ :

Code : Tout sélectionner

update table1 a set a.champ1= (select a.champ2*count(*) from table2 b where contraintes); commit;
("contraintes" remplace de façon schématique toutes les conditions where qui se trouve dans mon script)

Mais suite à une modification, ce code doit être valable seulement pour mes données avant 2008. A partir de 2008, il faut donc que je précise une condition :

- pour date<=2007 alors script normal
- pour date >= 2008 alors script modifié

J'ai donc fait ceci :

Code : Tout sélectionner

update table1 a set a.champ1= (select a.champ2*count(*) from table2 b where contraintes and b.date<=2007); commit; update table1 a set a.champ1= (select a.champ2*count(*) from table2 b where contraintes and b.date>=2008 and b.type<>'Nouveau'); commit;
Mais le premier update est écrasé par le second et je n'obtiens au final qu'une mise à jour de mon champ a.champ1 pour la date>=2008. Le champ est null pour la date<=2007.

Comment puis-je faire en sorte de faire la mise à jour pour l'ensemble de mes données (toutes les dates) avec les 2 traitements spécifiques ? Je pense qu'il faut mettre en place une contrainte mais je ne vois pas vraiment comment ?

Toute aide sera la bienvenue Merci d'avance ! :wink: :idea: :idea: :idea:

Posté : 16 oct. 2008, 14:57
par furiouslol
Salut

Le SELECT te sers bien a définir avec quelle valeur tu vas updater ton champ, par contre il faut que tu mette une clause WHERE a ton update

Code : Tout sélectionner

update table1 a set a.champ1= (select a.champ2*count(*) from table2 b where contraintes) where (condition avant ta date clé);
et

Code : Tout sélectionner

update table1 a set a.champ1= (select a.champ2*count(*) from table2 b where contraintes) where (condition apres ta date clé);
Sinon tu vas updater champ1 dans toutes les lignes de tables 1 avec la meme valeur (et donc écraser lors du deuxieme update)

Posté : 16 oct. 2008, 15:01
par sebhades
Salut

Le SELECT te sers bien a définir avec quelle valeur tu vas updater ton champ, par contre il faut que tu mette une clause WHERE a ton update

Code : Tout sélectionner

update table1 a set a.champ1= (select a.champ2*count(*) from table2 b where contraintes) where (condition avant ta date clé);
et

Code : Tout sélectionner

update table1 a set a.champ1= (select a.champ2*count(*) from table2 b where contraintes) where (condition apres ta date clé);
Sinon tu vas updater champ1 dans toutes les lignes de tables 1 avec la meme valeur (et donc écraser lors du deuxieme update)
Oui c'est ce que je pensais mais ma condition relative à la date est sur ma table2, alors que la condition ne peut être que sur la table1 a priori. Du coup je ne sais pas comment mettre une condition au UPDATE qui soit sur la table2.