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 :

[9i][SQL] update incrémentiel d'un champ sur plusieurs lignes


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 112
    Points : 54
    Points
    54
    Par défaut [9i][SQL] update incrémentiel d'un champ sur plusieurs lignes
    Bonjour,

    Je n'arrive pas à construire une requête.

    un dessin étant mieux que 1000 explications

    ma table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ---------------------------------------------
         VALEUR                            | VERSION
    ---------------------------------------------
          A                                           1
          A                                           1
          A                                           1
          B                                           1
          B                                           1
    je désire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    ---------------------------------------------
         VALEUR                            | VERSION
    ---------------------------------------------
          A                                           1
          A                                           2
          A                                           3
          B                                           1
          B                                           2
    Donc à chaque fois que je trouve la même valeur dans la colonne 1,
    j'incrémente le champs version.

    Et je n'ai pas la moindre idée de comment faire celà.

    si une âme charitable pouvait m'aider....

    Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 76
    Points : 82
    Points
    82
    Par défaut
    Bonjour,

    Tu veux faire cela en une seule requete ?

    Sinon tu peux toujours t'en sortir avec un script PL/SQL...

    Raphaël

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 112
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par rapha51 Voir le message
    Bonjour,

    Tu veux faire cela en une seule requete ?

    Sinon tu peux toujours t'en sortir avec un script PL/SQL...

    Raphaël
    Oui, en une seule requête ça serait parfait si c'est possible et si ça ne prend pas 10x plus de temps au traitement.

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Regarde le tuto de lalystar sur les fonctions analytiques.
    C'est super facile pour ton cas.

    Utilises ROW_NUMBER()

  5. #5
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL> select c, row_number () over (partition by c order by c) from t1;
    C ROW_NUMBER()OVER(PARTITIONBYCORDERBYC)
    - --------------------------------------
    A                                      1
    A                                      2
    A                                      3
    B                                      1
    B                                      2
    Il faut peut-être revoir la clause order by pour le calcul de l'incrément.

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Dans ton exemple tu as donné des n° de version toujours = 1
    Voici un code. La partition se fait par valeur quelque soit la version.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    WITH t AS (
    	SELECT 'A' valeur, 2 VERSION FROM dual
    UNION ALL
    	SELECT 'A' valeur, 1 VERSION FROM dual
    UNION ALL
    	SELECT 'A' valeur, 1 VERSION FROM dual
    UNION ALL
    	SELECT 'B' valeur, 1 VERSION FROM dual
    UNION ALL
    	SELECT 'B' valeur, 1 VERSION FROM dual
    )
    SELECT valeur, VERSION, row_number() OVER (PARTITION BY valeur ORDER BY VERSION) AS v2
    FROM t

  7. #7
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 112
    Points : 54
    Points
    54
    Par défaut
    Citation Envoyé par plaineR Voir le message
    Quelque chose comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SQL> select c, row_number () over (partition by c order by c) from t1;
    C ROW_NUMBER()OVER(PARTITIONBYCORDERBYC)
    - --------------------------------------
    A                                      1
    A                                      2
    A                                      3
    B                                      1
    B                                      2
    Il faut peut-être revoir la clause order by pour le calcul de l'incrément.

    Youhou les fonctions analytiques depuis que je les connais ça me change la vie........................................mais j'ai toujours pas le reflexe

    et pourtant ça faisait bien 2 bonnes heures que j'étais dessus

    merci à tous.

    M'en va faire la fête à mon code

  8. #8
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 112
    Points : 54
    Points
    54
    Par défaut
    hum hum....

    Je reviens à vous tout penaud.
    Je n'ai pas précisé au début mais en fait je dois faire un update du champs version

    la requête marche nickel.

    Le problème c'est que je ne vois pas comment je peux faire l'update de mon champs version avec



    @Mcm: la valeur dans le champs version est la valeur par défaut. c'est elle que je dois modifier. donc peut m'importe la valeur non?

    M'en va décocher "Résolu"

  9. #9
    Futur Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 6
    Points : 8
    Points
    8
    Par défaut
    si tu veux juste augmenter ta version de 1 pourquoi tu fais pas un (select max(version) from table ) +1 dans la nouvelle valeur

  10. #10
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Essaie :
    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
    SQL> update t1 a set version = (select rnum 
                                    from (select rowid,
                                                 row_number () over (partition by c order by c) rnum 
                                          from t1) 
                                    where rowid = a.rowid);
     
    5 rows updated.
     
    SQL> select * from t1;
     
    C   VERSION
    - ---------
    A         1
    A         2
    A         3
    B         1
    B         2

  11. #11
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par dheud Voir le message
    si tu veux juste augmenter ta version de 1 pourquoi tu fais pas un (select max(version) from table ) +1 dans la nouvelle valeur
    Très mauvais au niveau perf. sur de grosses tables et là gigigao veut calculer la version sur toutes les lignes déjà existantes dans sa table (si j'ai bien compris)

  12. #12
    Futur Membre du Club
    Profil pro
    Développeur Web
    Inscrit en
    Septembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Septembre 2007
    Messages : 6
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par plaineR Voir le message
    Très mauvais au niveau perf. sur de grosses tables et là gigigao veut calculer la version sur toutes les lignes déjà existantes dans sa table (si j'ai bien compris)
    oué, je suis peut être allé un peut vite

  13. #13
    Membre du Club
    Inscrit en
    Décembre 2005
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 112
    Points : 54
    Points
    54
    Par défaut
    Maintenant je peux dire........................

    ça marche nickel jusqu'au bout cette fois.

    Merci beaucoup de votre aide.

    s'en va défintivement coché résolu..............et revoir certains automatismes

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

Discussions similaires

  1. AWK Comparer un champ sur plusieurs lignes
    Par drac08 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 21/08/2012, 18h03
  2. Shell - Report d'1 champ sur plusieurs lignes
    Par coco_mtl dans le forum Unix
    Réponses: 2
    Dernier message: 26/01/2011, 17h52
  3. La meme valeur dans un champ sur plusieurs lignes
    Par JeanduB dans le forum Access
    Réponses: 8
    Dernier message: 15/05/2008, 14h52
  4. [SSRS] cangrow -- champ sur plusieurs lignes
    Par marie253 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/11/2007, 08h27
  5. 8i : sql loader et champ texte sur plusieurs lignes
    Par naonedboy dans le forum SQL*Loader
    Réponses: 1
    Dernier message: 23/11/2005, 10h07

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