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 :

Mise à jour d'une table par une seconde table avec plusieurs valeurs


Sujet :

SQL Oracle

  1. #1
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut Mise à jour d'une table par une seconde table avec plusieurs valeurs
    Bonjour,

    j'ai cette requête de mise à jour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Update aemservice ser set ser.resource_id =nvl(( select nvl(rel.rel_value,' ')
                                                from aemrelvalue rel 
                                                where rel.ATTRIBUTE_ID      ='JG'
                                                  AND rel.att_value         = ser.service_id 
                                                  AND rel.REL_ATTR_ID       ='C0' AND rel.status='N' ),' ')
    La sous requête me renvoi plusieurs valeurs et je n'ai pas à ma disposition de possibilité de faire de distinguo entre les lignes pour isoler la ligne 1,2,3.... .

    Je cherche une astuce pour mettre à jour le champ ser.resource_id avec la 1ier valeur renvoyé par la sous requete puis ser.resource_id1 avec la deuxieme ect ...

    merci de votre aide

    Merci de votre aide.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    Faites une vue qui pivote votre table de base.

    Pour ceci vous pouvez vous appuyer sur une fonction de fenêtrage en amont afin de trier / partitionner les données.

  3. #3
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut
    bonjour,

    Merci pour votre idée. Entre temps j'ai trouvé un post avec une question similaire j'ai adapté ma sous requete ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select min(nvl(rel.rel_value,' ')) keep (dense_rank first ORDER BY rel.rel_value DESC)
                                                from aemrelvalue rel 
                                                where rel.ATTRIBUTE_ID      ='JG'
                                                  AND rel.att_value         = 'GEL3FIN001'--ser.service_id 
                                                  AND rel.REL_ATTR_ID       ='C0' AND rel.status='N'
    a présent je cherche a avoir la seconde donnée.

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    exemple de donnée :

    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
     
    with tmp as (
    select 'a' as pivot, 1 as val from dual union all
    select 'a', 5 from dual union all
    select 'a', 12 from dual union all
    select 'b', 2 from dual union all
    select 'b', 3 from dual union all
    select 'c', 10 from dual),
    tmp2 as (
    select pivot, val, row_number() over(partition by pivot order by val) as rnk
    from tmp)
    select pivot,
    max(case when rnk = 1 then val end) as res1,
    max(case when rnk = 2 then val end) as res2
    from tmp2
    group by pivot

  5. #5
    Membre éprouvé Avatar de shaun_the_sheep
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Octobre 2004
    Messages
    1 619
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 619
    Points : 996
    Points
    996
    Par défaut
    Merci de votre aide, je suis parti sur l'idée de la table temporaire ce qui donne :

    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
     
    Update aemservice ser set ser.resource_id = 
    nvl((WITH tmp AS 
     ( 
      select rel.rel_value,
             rel.att_value, 
             DENSE_RANK() OVER (PARTITION BY rel.att_value ORDER BY rel.rel_value) as rank
      from aemrelvalue rel 
      where rel.ATTRIBUTE_ID      ='JG'   
       AND rel.REL_ATTR_ID       = 'C0' 
       AND rel.status='N'   
     )
     Select rel_value
     From  tmp 
     Where att_value  = ser.service_id 
     and rank=1
    ),' '

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/08/2011, 11h12
  2. Réponses: 0
    Dernier message: 08/04/2010, 12h58
  3. [VBA-E]Mise à jour de cellule alimentée par une liste
    Par moritan dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 19/01/2007, 06h11
  4. Réponses: 11
    Dernier message: 05/10/2006, 13h20
  5. Réponses: 9
    Dernier message: 22/05/2006, 12h21

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