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

Langage SQL Discussion :

[Oracle] Faire des jointures dans un update


Sujet :

Langage SQL

  1. #1
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut [Oracle] Faire des jointures dans un update
    Bonjour,

    Je précise que je travaille sur une base ORACLE.

    Pour simplifier, j'ai 2 tables avec les colonnes suivantes :

    table T_DEBITEUR :
    - ID_DEBITEUR
    - HEADER

    table T_ELEMENT :
    - ID_ELEMENT
    - ID_DEBITEUR
    - ASSUREUR

    Les éléments de la table T_ELEMENT et T_DEBITEUR sont liés par l'ID_DEBITEUR.

    Je veux mettre à jour la valeur de T_ELEMENT.ASSUREUR avec la valeur de T_DEBITEUR.HEADER associé seulement si T_DEBITEUR.HEADER n'est pas NULL. Autrement dit :

    Si T_DEBITEUR.HEADER != null
    alors T_ELEMENT.ASSUREUR = T_DEBITEUR.HEADER
    sinon T_ELEMENT.ASSUREUR reste inchangé.

    J'ai tenté cette requête :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    update
        T_ELEMENT elt
        set elt.ASSUREUR = (
            select HEADER
                from T_DEBITEUR debiteur
                where
                    debiteur.HEADER is not null
                    and debiteur.ID_DEBITEUR = elt.ID_DEBITEUR);
    Cette requête met bien à jour les élements qui sont liés à un DEBITEUR dont l'HEADER n'est pas NULL.
    Par contre, si le DEBITEUR a HEADER = NULL, alors l'ELEMENT associé va voir son champ ASSUREUR passé à NULL, alors que je souhaiterais qu'il soit inchangé.

    Autrement dit, ce que fait cette requête :

    Si T_DEBITEUR.HEADER != null
    alors T_ELEMENT.ASSUREUR = T_DEBITEUR.HEADER (C'est bon)
    sinon T_ELEMENT.ASSUREUR = null (PAS BON).


    Comment puis-je corriger ma requête pour faire correctement ce que je veux ?
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Il suffit de rajouter un WHERE pour ne mettre à jour que les lignes qui correspondent aux conditions spécifiées :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE T_ELEMENT elt
    SET elt.ASSUREUR = (SELECT HEADER
                        FROM T_DEBITEUR deb
                        WHERE deb.HEADER IS NOT NULL
                        AND deb.ID_DEBITEUR = elt.ID_DEBITEUR)
    WHERE EXISTS (SELECT NULL FROM T_DEBITEUR deb
                  WHERE deb.HEADER IS NOT NULL
                  AND deb.ID_DEBITEUR = elt.ID_DEBITEUR);

  3. #3
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Merci Waldar !

    Ca marche. Je ne trouve pas ça super joli, c'est fait un peu répétitif, mais ça marche
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  4. #4
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Finalement, j'ai opté pour la solution suivante :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    UPDATE (
        SELECT elt.assureur, debiteur.header
            FROM T_ELEMENT elt, T_DEBITEUR debiteur
            WHERE elt.id_debiteur = debiteur.id_debiteur
                AND debiteur.header IS NOT NULL)
       SET assureur = IDHEADER;
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 27/09/2006, 08h50
  2. Que faut il utiliser pour faire des recherches dans LDAP?
    Par kabouns dans le forum API standards et tierces
    Réponses: 5
    Dernier message: 04/08/2006, 15h24
  3. Faire des test dans une base de donnée
    Par kj_83 dans le forum C++Builder
    Réponses: 15
    Dernier message: 06/07/2006, 09h54
  4. Je n'arrive pas à faire des boucles dans un répertoire
    Par padodanle51 dans le forum Linux
    Réponses: 4
    Dernier message: 04/05/2006, 18h04
  5. [HTML] faire des tabulation dans une liste <select>
    Par renofx1 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 20/01/2006, 23h36

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