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 :

2 requêtes pas évidentes à différencier


Sujet :

Langage SQL

  1. #1
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut 2 requêtes pas évidentes à différencier

    Je voudrais savoir quelle différence il y a entre ces 2 requêtes (et savoir s'il y en a une qui est mieux que l'autre et plus correcte que l'autre) parce que là je ne vois vraiment pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT AT_NAME, AT_TYPE, AL_VALUE
    FROM T_AL_ATTRIBUTES_LIST INNER JOIN T_AT_ATTRIBUTE ON AL_AT_ID = AT_ID 
                              INNER JOIN T_AR_AREA ON AL_AR_ID = AR_ID
    WHERE AR_LA_ID=8
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT AT_NAME, AT_TYPE, AL_VALUE
    FROM T_AL_ATTRIBUTES_LIST INNER JOIN T_AT_ATTRIBUTE ON AL_AT_ID = AT_ID
                              INNER JOIN T_AR_AREA ON AL_AR_ID = AR_ID AND AR_LA_ID = 8

  2. #2
    En attente de confirmation mail Avatar de fred777888999
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 250
    Points : 292
    Points
    292
    Par défaut
    Ca depends de ta base... normalement y'en a pas, mais si la colonne AR_LA_ID fait partie d'un index sur T_AR_AREA, ce dernier pourrait ne pas etre pris en compte dans le premier cas...

  3. #3
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    pour ta réponse fred777888999.
    Mais pour quelle raison il ne serait pas pris en compte :
    J'arrive pas à voir pourquoi.

  4. #4
    Expert éminent
    Homme Profil pro
    Big Data / Freelance EURL
    Inscrit en
    Mars 2003
    Messages
    2 124
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Big Data / Freelance EURL

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 124
    Points : 7 291
    Points
    7 291
    Par défaut
    Avec INNER JOIN je pense que ça donne la même chose mais avec un LEFT JOIN ça peut donner quelque chose de diffèrent surtout si la restriction se fait sur un membre à droite comme AR_ID =8.

    Dans le cas d'un LEFT JOIN ta première requête fera bien une belle requête externe et c'est après que cette jointure soit effectuée que se fera la restriction.

    De ce point de vue de faire les jointures dans les jointures (JOIN) et les restrictions dans le WHERE est plus propre, plus lisible et on est sûr d'avoir une réponse que l'on attends.

    Inversemment moi qui avait l'habitude des jointures à l'ancienne mode, je ne pouvais faire cette distinction.

    Si on avait l'habitude d'écrire, (sous oracle que je connais mieux),
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM T1 , T2 WHERE T1.id1=(+)T2.id2 and T2.id2 is not null
    on aura tendance à croire que c'est équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM T1 LEFT JOIN T2 ON T1.id1=T2.id2 and T2.id2 is not null
    que nenni ça sera équivalent à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM T1 LEFT JOIN T2 ON T1.id1=T2.id2 WHERE T2.id2 is not null
    sinon on ne trouve pas la même chose.

    SQL Pro >2. Syntaxe normalisée des jointures > 2.4.3. Discussion sur la jointure externe
    http://sqlpro.developpez.com/cours/s...ntures/#L2.4.3

    PS: LEFT JOIN c'était =(+) sous oracle et *= sous SQL Server

    edit: Par contre avec des outils comme Business Objects (requêteurs) on ne peut à ma connaissance qu'utiliser uniquement les anciennes jointures. De toute façon même si c'était possible 90% des univers (fichiers de sauvegarde des modèles de données des requêteurs) sont avec des anciennes jointures.

  5. #5
    Membre expert
    Avatar de trotters213
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 571
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Gard (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 571
    Points : 3 145
    Points
    3 145
    Par défaut
    phili_b le petit dialogue est très bien fait et m'as permis de comprendre pas mal de truc.

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

Discussions similaires

  1. noncopiable mutex : pas évident
    Par Sébastien P dans le forum Boost
    Réponses: 6
    Dernier message: 24/02/2008, 23h14
  2. Réponses: 7
    Dernier message: 29/03/2007, 15h30
  3. [MySQL] syntaxe pas évidente à mettre en place
    Par mussara dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/11/2006, 11h20
  4. Requête pas égale
    Par mavean dans le forum Access
    Réponses: 3
    Dernier message: 26/11/2005, 22h45
  5. requête "pas égal"
    Par juju124 dans le forum Access
    Réponses: 13
    Dernier message: 29/09/2005, 21h10

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