Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/01/2011, 15h48   #1
Invité de passage
 
Inscription : janvier 2006
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 8
Points : 1
Points : 1
Par défaut Mettre à jour une zone en lisant en même temps les données de la table

Bonjour,
j'ai un petit problème pour mettre à jour une table de ma base de données.
Actuellement, la structure de ma table est la suivante :
create table T1 (COL1 char(10) not null, COL2 date not null, ...);
La clé de ma table est composée de COL1 et de COL2.

Pour les besoins d'une mise à jour fonctionnelle, ma table T1 aura désormais la structure suivante :
create table T1 (COL1 char(10) not null, COL2 number(6,0) not null, ...);
c'est à dire que la zone de date est supprimée au profit d'une zone numérique qui est en fait un compteur s'incrémentant de 1 en 1, en groupant les enregistrements par COL1.

create table T2 as select * from T1;
alter table T1 drop column COL2;
alter table T1 add COL2 number(6,0);

Mon problème est que la requête que je voulais exécuter pour mettre à jour cette table ne fonctionne pas correctement :

update T1 set COL2=(select max(COL2)+1 from T1 a where a.COL1=T1.COL1);

car les enregistrements ayant la même valeur de COL1 ont également la même valeur pour COL2 (il ne recalcule pas à chaque lecture/mise à jour).

Il faudrait, je suppose, une sorte de requête magique du style :

update T1 set COL2=rownum group by COL1;

Auriez-vous une solution pour m'aider, SVP ?

Merci d'avance.
Cordialement,
Lionel
cyberioio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 16h50   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Quelque chose comme ça
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
CREATE TABLE T2 AS SELECT * FROM T1
/
ALTER TABLE T1 
ADD col2_bis number(6)
/
Merge INTO t1 d
  USING (SELECT col1, col2, 
                rank() over partition BY (col1 ORDER BY col2 ASC) col2_bis
           FROM t2
        ) s
    ON (    d.col1 = s.col1
        AND d.col2 = s.col2
       )       
When Matched Then UPDATE SET d.col2_bis = s.col2_bis       
/
ALTER TABLE t1
  DROP col2
/
ALTER TABLE t1
  RENAME col2_bis TO col2
/
Ce n'est pas la peine de tester si vous n'est pas en Oracle 10.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 17h27   #3
Invité de passage
 
Inscription : janvier 2006
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 8
Points : 1
Points : 1
Je suis sous Oracle 11g, par contre, lorsque j'essaie d'exécuter la requete du merge, j'ai une erreur au niveau de l'appel de la fonction rank() :
ORA-30484: absence de specification de fenetre pour cette fonction
cyberioio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/01/2011, 18h14   #4
Invité de passage
 
Inscription : janvier 2006
Messages : 8
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 8
Points : 1
Points : 1
OK c'est bon , ça fonctionne avec les parenthèses au bon endroit.

MERCI !
cyberioio est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h11.


 
 
 
 
Partenaires

Hébergement Web