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

MS SQL Server Discussion :

Jointure récalcitrante sur clef multiple


Sujet :

MS SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Points : 11
    Points
    11
    Par défaut Jointure récalcitrante sur clef multiple
    Bonjour,

    J'ai 2 tables (T1 et T2) définies comme suit (CF fichier xls joint) :

    T1 :
    C11 C12 C13 et d'autres colonnes C1y
    A D G
    B E H
    C F I

    T2 :
    C21 C22 C23 C24 et d'autres colonnes C2x
    A D G 1
    J D L 9
    B E H 3
    M N H 2
    C F I 5
    A N I 7

    Le but est de construire une requête qui me retourne :
    C11 C12 C13 C24
    A D G 1
    B E H 3
    C F I 5

    Ces exemples de tables sont dans le fichier excel joint.

    pour faire ça j'ai fais un truc pas terrible en terme de performance :

    select C11,C12,C13,(select C24 from T2 where C21=C11 and C22=C12 and C23=C13) as C24
    from T1

    En fait, c'est même inutilisable car mes tables font plusieurs millions de lignes et la requête n'en fini pas de s’exécuter en prenant un max de ressources.

    Je cherche à faire quelque chose d'intelligent avec une jointure entre T1 et T2 sans succès. Un truc du style :

    select C11,C12,C13,C24
    from T1 left outer join T2 on C21=C11 and C22=C12 and C23=C13

    mais ça me ramène toujours plus de 3 lignes car il faut tester la jointure sur le triplet C11,C12,C13 avec le triplet C21,C22,C23...

    Si vous connaissez la solution je suis preneur !

    Merci d'avance,

    Guillaume
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 848
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 848
    Points : 52 964
    Points
    52 964
    Billets dans le blog
    6
    Par défaut
    Les colonnes mise en relation sont-elles indexées ?

    Si ce n'est pas le cas, créez les index suivants :

    CREATE INDEX X_T1_C11_C12_C13 ON T1 (C11, C12, C13);
    CREATE INDEX X_T2_C21_C22_C23 ON T2 (C21, C22, C23);

    Commencez par un INNER JOIN :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select C11, C12, C13, C24
    from   T1 
           INNER join T2 
                on C21=C11 and C22=C12 and C23=C13
    Et testez la jointure externe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select C11, C12, C13, C24
    from   T1 
           left outer join T2 
                on C21=C11 and C22=C12 and C23=C13
    Lisez les article que j'ai écrit sur l'indexation en général :
    http://blog.developpez.com/sqlpro/p7...d-index-ni-de/
    http://sqlpro.developpez.com/cours/quoi-indexer/
    http://sqlpro.developpez.com/optimis...ntenanceIndex/
    http://sqlpro.developpez.com/optimisation/indexation/

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 21
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    CREATE INDEX X_T1_C11_C12_C13 ON T1 (C11, C12, C13);
    CREATE INDEX X_T2_C21_C22_C23 ON T2 (C21, C22, C23);

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select C11, C12, C13, C24
    from   T1 
           left outer join T2 
                on C21=C11 and C22=C12 and C23=C13
    Merci ! avec la jointure externe et les INDEX ça fonctionne parfaitement !

    Merci pour l'astuce des index, ça améliore énormément mes performances !

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

Discussions similaires

  1. Jointure sur requêtes multiples
    Par cedrick21 dans le forum Langage SQL
    Réponses: 9
    Dernier message: 10/09/2012, 16h59
  2. Accès direct et multiple sur clef
    Par enicnath dans le forum SAS Base
    Réponses: 7
    Dernier message: 17/02/2010, 14h41
  3. [DATA] Jointure sur identifiant multiple
    Par Tyler Durden dans le forum SAS Base
    Réponses: 2
    Dernier message: 02/10/2009, 20h15
  4. Jointure externe sur 2 tables
    Par Danae dans le forum Langage SQL
    Réponses: 11
    Dernier message: 19/07/2005, 15h37
  5. [ORACLE 9i] - Jointure ouverte sur decode
    Par sygale dans le forum Oracle
    Réponses: 3
    Dernier message: 21/04/2005, 16h07

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