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 :

Update avec triple jointure


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 469
    Points : 167
    Points
    167
    Par défaut Update avec triple jointure
    Salut,

    J'aimerais effectuer un update sur un champ d'une table à partir d'une deuxième table mais ma jointure est sur 3 champs

    Voici ma syntaxe qui fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE TABLE1 t1 
     SET champ1table1 = ( 
     SELECT champtable2 
     FROM TABLE2 t2 
     WHERE t2.c1=  t1.c1 
     and t2.c2 =  t1.c2 
     and t2.c3 =  t1.c3 
      ) 
      where c4 = 'condition1' 
    AND c5 = 'condition2'
    J'aimerias savoir s'il y a un moyen d'optimiser cette requête par exemple en rajoutant les condition du where à la fin de ma requete mais cela ne fonctionne pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    UPDATE TABLE1 t1 
     SET champ1table1 = ( 
     SELECT champtable2 
     FROM TABLE2 t2 
     WHERE t2.c1=  t1.c1 
     and t2.c2 =  t1.c2 
     and t2.c3 =  t1.c3 
      ) 
      where c4 = 'condition1' 
    AND c5 = 'condition2'
    and t2.c1=  t1.c1 
     and t2.c2 =  t1.c2 
     and t2.c3 =  t1.c3
    merci pour votre aide
    ----------------------------------
    La façon la plus efficace de combattre un système qui ne nous convient plus
    n'est pas de lutter contre lui mais de s'en désintéresser et de ne plus l'alimenter...

    ----------------------------------

  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
    Votre première syntaxe est correcte et efficace.

    Que se passe-t-il si vous ne trouvez pas de correspondance sur votre table t2, aujourd'hui vous remettez la colonne champ1table1 à null, est-ce bien votre souhait ?

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    On rajoute rarement de l'éfficacité en compliquant une requête simple
    Si la requête rame, c'est peut etre un pb d'index sur TABLE2 (c1,c2,c3) ou bien sur TABLE1 (c4,c5)

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Votre première syntaxe est correcte et efficace.

    Que se passe-t-il si vous ne trouvez pas de correspondance sur votre table t2, aujourd'hui vous remettez la colonne champ1table1 à null, est-ce bien votre souhait ?
    Effectivement il manque peut etre une clause de filtrage, mais ça va changer le truc fonctionnellement (rien faire plutot que de mettre des null quand y'a pas de correspondance)

    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
    UPDATE TABLE1 t1 
     SET champ1table1 = ( 
     SELECT champtable2 
     FROM TABLE2 t2 
     WHERE t2.c1=  t1.c1 
     AND t2.c2 =  t1.c2 
     AND t2.c3 =  t1.c3 
      ) 
      WHERE c4 = 'condition1' 
     AND c5 = 'condition2'
     AND EXISTS (
     select 1 from TABLE2 F 
    where F.c1=  t1.c1 
     AND F.c2 =  t1.c2 
     AND F.c3 =  t1.c3
    )

  5. #5
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 469
    Points : 167
    Points
    167
    Par défaut
    Merci à tous

    effectivement
    "
    Que se passe-t-il si vous ne trouvez pas de correspondance sur votre table t2, aujourd'hui vous remettez la colonne champ1table1 à null, est-ce bien votre souhait ?"

    oui c bien mon souhait elle est mise à null si pas de correspondance.

    Je voulais essayer avec des inner join mais je connais pas trop

    je vais essayer le exist pour voir si je gangne du temps
    ----------------------------------
    La façon la plus efficace de combattre un système qui ne nous convient plus
    n'est pas de lutter contre lui mais de s'en désintéresser et de ne plus l'alimenter...

    ----------------------------------

  6. #6
    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
    Si vous désirez mettre des nulls s'il n'y a pas pas de correspondance, alors votre première requête est très bien.
    Si vous avez un problème de performance, voir du côté des index comme le suggère remi4444.

  7. #7
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par lenoil Voir le message
    je vais essayer le exist pour voir si je gangne du temps
    Non attention! j'ai bien prévenu que le EXISTS changeait le fonctionnement à savoir que la non-correspondance ne mettra pas de null, les ligne ne seront plus affectées.

    Si c'est votre souhait de mettre du null, alors ne changez rien à votre requete qui est très bien, il y a un pb d'index ou alors d'écriture de condition.

  8. #8
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 469
    Points : 167
    Points
    167
    Par défaut
    ok je vais garder ma requete et regarder du coté des index

    Avec le exist cela semble plus long ....

    Dommage que je ne puisse pas traiter que eux qui m'intéresse dans ma table1

    Merci en tout cas
    ----------------------------------
    La façon la plus efficace de combattre un système qui ne nous convient plus
    n'est pas de lutter contre lui mais de s'en désintéresser et de ne plus l'alimenter...

    ----------------------------------

  9. #9
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par lenoil Voir le message

    oui c bien mon souhait elle est mise à null si pas de correspondance.
    Citation Envoyé par lenoil Voir le message

    Dommage que je ne puisse pas traiter que eux qui m'intéresse dans ma table1
    Vous vous contredisez là...

    de toutes manières, EXISTS ou pas, ce sont les même index qui seront pris en comtpe.

  10. #10
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 469
    Points : 167
    Points
    167
    Par défaut
    je comprends pas

    si j'ai 4000 enregistrements dans ma table 1 avec ma condition de départ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    c4 = 'condition1' 
     AND c5 = 'condition2'
    quand je fais ma requete j'ai par exemple 3000 enregistrements qui correspondent

    or dans ma requete je parcours quand même les 4000

    where c4 = 'condition1'
    AND c5 = 'condition2'

    j'aurais voulu éviter ceci ...
    mais je me perds un peu
    ----------------------------------
    La façon la plus efficace de combattre un système qui ne nous convient plus
    n'est pas de lutter contre lui mais de s'en désintéresser et de ne plus l'alimenter...

    ----------------------------------

  11. #11
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Citation Envoyé par lenoil Voir le message

    quand je fais ma requete j'ai par exemple 3000 enregistrements qui correspondent
    Qui correspondent à quel critère ?

  12. #12
    Membre habitué
    Inscrit en
    Novembre 2004
    Messages
    469
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 469
    Points : 167
    Points
    167
    Par défaut
    à ceux ci
    t2.c1= t1.c1
    AND t2.c2 = t1.c2
    AND t2.c3 = t1.c3
    ----------------------------------
    La façon la plus efficace de combattre un système qui ne nous convient plus
    n'est pas de lutter contre lui mais de s'en désintéresser et de ne plus l'alimenter...

    ----------------------------------

  13. #13
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Donc, contrairement à ce que tu as dit tout à l'heure, il ne faut pas mettre des null dans les lignes ne correspondant pas, il faut ne rien faire, ce n'est pas pareil

    C'est alors la requête avec EXISTS qui est la bonne, assure toi que tu as bien un index sur ton triplet TABLE2(c1,c2,c3) d'une part et sur une ou 2 de tes colonnes impliquée dans les conditions sur la table TABLE1. Attention, tout est important. j'espère que tu as mis la requete exacte, car un simple détail comme un to_date, to_number ou une conversion implicite et ça change tout.

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

Discussions similaires

  1. Update avec une jointure
    Par widedouche dans le forum SQL
    Réponses: 3
    Dernier message: 04/06/2012, 09h45
  2. Update avec une jointure externe
    Par feldi dans le forum SQL
    Réponses: 2
    Dernier message: 08/02/2012, 11h33
  3. Update avec auto jointure
    Par samsso2006 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 24/03/2010, 19h01
  4. Update avec une jointure
    Par Tinfolley dans le forum SQLite
    Réponses: 2
    Dernier message: 17/11/2009, 13h10
  5. [PL/SQL] update avec jointure
    Par Fox_magic dans le forum Oracle
    Réponses: 6
    Dernier message: 09/12/2004, 12h19

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