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 :

Requête conditionnelle + Update (Oracle 10g)


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 71
    Points
    71
    Par défaut Requête conditionnelle + Update (Oracle 10g)
    Bonjour à tous
    Je penche sur un problème délicat.. Je cherche désespérément et teste plusieurs choses depuis ce matin, mais rien de fort concluant..

    Je possède cette table "CONTRAT" (c'est une table d'essai, mais qui me sert pour faciliter l'explication ici, et le principe est le même que la table principale que je souhaite manipuler) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
          NUM LIBELLE               ID_CLIENT      COLSUP
    --------- -------------------- ---------- -----------
            1 00Location                    1
            6 00Vente                       3
            7 00Cession                     5
    L'idée serait par exemple d'insérer la valeur "OUI" dans la colonne "COLSUP" lorsque la ligne courante possède le libellé "00Cession" et lorsque l'ID client vaut "5".


    /!\ IMPORTANT : Je ne veux pas faire quelque chose dans le style "...WHERE Libelle='00Cession' AND ID_client='5';" .. Ca serait trop simple Je recherche bien à le faire de manière conditionnelle (car la table finale que je dois manipuler comporte beaucoup de condition etc.. /!\


    Imaginez que la table comporte beaucoup de lignes (ici c'est juste pour l'exemple).
    J'ai donc créé cette requête, par le moyen de la fonction "decode" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    UPDATE contrat
    set COLSUP=decode(LIBELLE,'00Cession',decode(
                                     (select ID_client 
                                      from contrat 
                                      where rownum<2),5,'OUI'));
    Théoriquement ça paraît correcte.. Mais le soucis c'est qu'Oracle travaille comme ceci (du moins je crois) :
    Apparemment il passe toutes les lignes les unes après les autres, et une fois à la 3ème ligne, il trouve bien "00Cession"! Jusque là pas de soucis! Seulement au moment de regarder l'ID_CLIENT, c'est L'ID de la première ligne qu'il regarde! Je n'obtiens donc jamais le mot "OUI" dans la 3ème ligne de la colonne "COLSUP"...

    Je me demande donc comment dire à Oracle de toujours faire le select sur la valeur courante de la ligne (et non pas de reprendre la première à chaque fois)..
    Je pense que le "rownum<2" est en cause, mais je ne vois pas par quoi le remplacer... J'ai pu lire de virer le "rownum<2" pour mettre un distinct après mon select, mais toujours le même problème..

    Merci beaucoup

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Pourquoi faire une sous-requête pour récupérer l'id_client... alors que vous pouvez juste écrire id_client ?

    Si vous ne mettez pas de where, Oracle mettra à jour TOUTE la table.

    De plus vous confondez filtre et valeur de mise à jour.
    La partie mise à jour est toujours la même, vous voulez écrire oui.

    Votre requête DOIT s'écrire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    UPDATE contrat
       SET COLSUP = 'OUI'
     WHERE coalesce(COLSUP, 'NON') <> 'OUI'
       AND LIBELLE = '00Cession'
       AND ID_client = 5;
    Si vous avez plusieurs couples (libelle, id_client) à prévoir, vous pouvez soit passer par une sous-requête, soit par une liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    UPDATE contrat
       SET COLSUP = 'OUI'
     WHERE coalesce(COLSUP, 'NON') <> 'OUI'
       AND (ID_client, LIBELLE) IN ((5, '00Cession'), (6, 'Toto'), ...)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Laissez tomber les decode, travaillez avec CASE.

    Si vous ne mettez pas de where, Oracle mettra à jour TOUTE la table.

    Je m'attendais à une réponse de ce style :-p
    Voilà pourquoi j'ai déjà tenté le case, mais je suis bloqué au moment de "l'imbrication" des conditions. Je m'explique. Voilà déjà le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    UPDATE CONTRAT
    SET COLSUP=CASE(
    WHEN LIBELLE='00Cession' THEN  WHEN ID_CLIENT=5 THEN'OUI'
    END
    );
    Voyez vous où je veux en venir? J'aimerai imbriquer un autre "when" dans le premier.. (en gros l'équivalent d'un "SI" dans un autre quoi..). Mais je ne sais pas si les "IF" sont tolérés..


    Citation Envoyé par Waldar Voir le message
    Pourquoi faire une sous-requête pour récupérer l'id_client... alors que vous pouvez juste écrire id_client ?
    Oh mon dieu... c'est de loin l'erreur la plus bête que j'ai pu faire Je suis sûr que le problème vient de là.. Et dire que j'ai perdu plusieurs heures là-dessus...

    En tout cas merci bien

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Attention, j'ai édité ma première réponse entre temps !

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 134
    Points : 71
    Points
    71
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Attention, j'ai édité ma première réponse entre temps !
    Effectivement!
    Quoiqu'au final mon erreur venait bien de là (ma requête est franchement énorme et très moche mais elle fonctionne.. Je vais donc pouvoir l'améliorer et la rendre plus "propre" grâce à vos conseils)
    Merci beaucoup Waldar. Au passage je tiens à m'excuser pour tous les topics que j'ai pu créer ici.. (3 en 3 jours c'est quand même beaucoup ) Voilà pourquoi j'ai passé ma journée à rechercher afin d'éviter de poster, même si au final j'en ai plus ou moins été contraint
    Merci encore!!

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/09/2007, 13h38
  2. [Oracle 10g] Problème Union-sous requêtes-group by
    Par slobberbone dans le forum SQL
    Réponses: 2
    Dernier message: 17/09/2007, 18h16
  3. [Oracle 10g] Temps d'exécution d'une requête
    Par tux2005 dans le forum Oracle
    Réponses: 5
    Dernier message: 31/08/2007, 13h42
  4. update conditionnel sous oracle
    Par piment dans le forum Langage SQL
    Réponses: 3
    Dernier message: 12/07/2007, 13h48
  5. [Oracle 10g]probleme avec une CONSTRAINT sur UPDATE
    Par Battosaiii dans le forum Langage SQL
    Réponses: 5
    Dernier message: 17/04/2006, 19h05

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