IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Mettre à jour une zone en lisant en même temps les données de la table


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 8
    Points : 7
    Points
    7
    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

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Quelque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    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

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 8
    Points : 7
    Points
    7
    Par défaut
    OK c'est bon , ça fonctionne avec les parenthèses au bon endroit.

    MERCI !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 06/08/2012, 00h41
  2. Réponses: 4
    Dernier message: 26/01/2009, 14h56
  3. Réponses: 13
    Dernier message: 11/10/2008, 12h24
  4. Mettre du code pour mettre à jour une zone
    Par AgriPhilou dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 01/06/2008, 13h25
  5. mettre à jour une zone de liste deroulante ?
    Par jessy212 dans le forum Access
    Réponses: 2
    Dernier message: 30/08/2006, 14h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo