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

Développement SQL Server Discussion :

Jointures imbriquées et jointures normales


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2007
    Messages : 58
    Par défaut Jointures imbriquées et jointures normales
    Bonjour,

    J'aurai besoin d'une vision exterieure sur un petit problème:

    Si je fais cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT A.id
    FROM A
       LEFT OUTER JOIN B
         INNER JOIN C ON C.B_id = B.id
       ON B.A_id = A.id
    elle équivaut à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT A.id
    FROM A
       LEFT OUTER JOIN B ON B.A_id = A.id
       LEFT OUTER C ON C.B_id = B.id
    Sur une autre requête avec multiples imbriquations je n'obtiens pas le même résultat mais sans en comprendre les raisons.
    J'aimerais donc savoir comment s'appelle le fait d'imbriquer des jointures (j'ai tappé "nested join", "jointures imbriquées" sur google sans résultat, msdn également) et si cette imbriquation peut-avoir une utilité particulière ou on peut lui trouver une équivalence avec une simple suite de jointures. Surtout que le fait d'imbriquer des jointures rend le temps d'exécution plus long..

    Merci pour vos réponses!

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Le terme "jointure imbriquée" n'existe pas dans le jargon des base de données relationnelles, c'est pourquoi votre recherche a été infructueuse.

    Sur une autre requête avec multiples imbriquations je n'obtiens pas le même résultat mais sans en comprendre les raisons.
    Il aurait mieux valu nous donner celle-ci !

    Spécifier des jointures comme vous le montrez dans votre premier exemple permet de spécifier celles-ci sans ce soucier de l'ordre d'apparition des tables dans les clauses FROM et JOIN.
    Dans un souci de lisibilité du code, il faudrait opter soit pour l'une, soit pour l'autre façon de spécifier des jointures.

    Surtout que le fait d'imbriquer des jointures rend le temps d'exécution plus long..
    Cela signifie plutôt que les colonnes dont vous vous servez comme clé pour effectuer vos jointures sont mal ou pas indexées.

    Les SGBDR sont conçus justement pour cela

    A+

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2007
    Messages : 58
    Par défaut
    Bonjour et merci pour votre réponse.

    J'ai essayé de reproduire l'écart de résultats que j'avais eu mais pas moyen. Pour me rassurer je me dis que les données ont été modifiées mais je crois bien en réalité que je me plantais quelque part et que les résultats sont bien équivalents dans les deux requêtes.. Il n'y aurait vraiment pas de raisons que les deux versions de la requête retournent des résultats différents..? j'aurai perdu une demi journée..?

    Pour ce qui est de la performance je crois que dans les deux cas les index utilisés sont les mêmes. Pourtant la première s'exécute en 250ms alors que la seconde prend 50ms.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2007
    Messages : 58
    Par défaut
    Je viens de reproduire sur une base d'essais:
    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
    18
    19
    20
     
    --cas 1
    select c.id from _COMMANDES c
    	left join _CLIGNES cl on cl.id_commande = c.id
    	left join _ARTS a on a.id = cl.id_ARTS
    	left join _CAT_ARTS ca on ca.id_ARTS = a.id
    --cas 2
    select c.id from _COMMANDES c
    	left outer join _CLIGNES cl 
    		inner join _ARTS a 
    			inner join _CAT_ARTS ca on ca.id_ARTS = a.id
    		on a.id = cl.id_ARTS
    	on cl.id_commande = c.id
    --cas 3
    select c.id from _COMMANDES c
    	left outer join _CLIGNES cl 
    		inner join _ARTS a 
    			left join _CAT_ARTS ca on ca.id_ARTS = a.id
    		on a.id = cl.id_ARTS
    	on cl.id_commande = c.id
    cas 1 et cas 2 ne retournent pas le même nombre d'enregistrements (1807 contre 1845)
    cas 1 et cas 3 retournent le même nombre d'enregistrements (c'est pour ca que je ne reproduisais pas sur mon précédent post)

    J'ai envie d'en déduire que dans cas 2 inner join categories_articles est "priorisé".. Avec un seul niveau d'imbriquation le left join compense le inner imbriqué mais le inner est "prioritaire" ?
    Y a-t-il une équivalence sans "imbriquation"?

  5. #5
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Par défaut
    Bonjour,

    Il vous faudrait regarder ce que sont les demi-jointures et les équi-jointures pour comprendre ce qui se passe à l'exécution de vos requêtes, qui sont décrites ici (n'oubliez pas les liens en bas de la page !)

    A+

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    22 001
    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 : 22 001
    Billets dans le blog
    6
    Par défaut
    les résultats sont bien équivalents dans les deux requêtes..
    Peut être dans votre cas particulier, mais pas dans le cas général !

    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/ * * * * *

Discussions similaires

  1. [MySQL] Erreur SQL 1064 : Requête imbriquée avec jointure !
    Par patchankito dans le forum Langage SQL
    Réponses: 5
    Dernier message: 31/01/2006, 10h37
  2. requete normale, imbriquée et jointure
    Par medonline dans le forum Requêtes
    Réponses: 3
    Dernier message: 15/01/2006, 16h01
  3. Requetes imbriquées et jointures avec 3 tables
    Par The Wretched dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/11/2005, 11h03
  4. Probleme de Jointures imbriquées dans une requête
    Par Crevin dans le forum Langage SQL
    Réponses: 3
    Dernier message: 13/04/2005, 11h05
  5. Requetes imbriquées et jointures
    Par Emile Le Tueur* dans le forum Requêtes
    Réponses: 4
    Dernier message: 31/03/2004, 23h12

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