Update sql avec conditions

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Update sql avec conditions

par sebhades » 16 oct. 2008, 15:01

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.

par furiouslol » 16 oct. 2008, 14:57

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)

Update sql avec conditions

par sebhades » 16 oct. 2008, 13:46

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: