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 :

Utilisation des jointures


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2016
    Messages : 7
    Points : 3
    Points
    3
    Par défaut Utilisation des jointures
    Bonjour,

    Je m'entraîne pour un concours et je suis tombée sur cette question :


    Nom : Question27-R&T-IESSA2015.png
Affichages : 257
Taille : 41,9 Ko

    La formulation des jointures est la suivante :
    SELECT *
    FROM A JOIN B ON A.idA=B.idA
    avec JOIN qui est adapté à la situation (INNER, FULL OUTER,...)

    Est-ce que cette formulation implique que le JOIN se trouve dans le FROM, et donc que la réponse b. est vraie ?

    On peut également utiliser WHERE pour réaliser des jointures, mais est-ce que selon vous, la question est formulée dans ce sens ?

    D'instinct, j'aurais tendance à répondre a. et c.

    Merci de toute aide que vous pourrez m'apporter.

    Bien cordialement,

    F.R.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    C'est le genre de question piégeuse.
    Effectivement, il n'y a pas de JOINsans FROM, de là à dire qu'on code (plutôt que programme) la jointure dans le FROM, je ne pense pas qu'on puisse le dire
    Donc comme vous A et C
    Bien évidemment, la jointure codée à l'ancienne dans le WHERE n'est pas recommandée et elle est incompatible avec les jointures externes.

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Pour ma part j'interprète le choix B comme l'écriture qu'on voit passer régulièrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select x
    from Table1,Table2
    where table1.colx = table2.coly
    Vu que la capture d'écran ressemble fort à un exercice, et que certains profs on du mal avec le JOIN...
    Donc j'élimine le B

    J'éliminerai le C car les critères de jointure doivent se trouver dans la clause JOIN. S'ils sont dans la clause WHERE, ça "implique" que la jointure est dans la clause FROM, donc que le choix B est valide.
    Comme je l'ai écarté C, j'écarte de facto B.

    D et E se passent de commentaire

    Tatayo.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par tatayo Voir le message
    Bonjour,
    Pour ma part j'interprète le choix B comme l'écriture qu'on voit passer régulièrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select x
    from Table1,Table2
    where table1.colx = table2.coly
    Pour moi, cette syntaxe c'est plutôt la réponse C : le from fait le produit cartésien et les critères de jointures sont dans la clause WHERE
    Mais bon, encore une fois, la question est piégeuse
    Il serait plus intéressant de demander les différentes façon de coder les jointures, et là, le candidat pourrait explicitement les citer en donnant des exemples, sans tomber dans les pièges liés à l'interprétation de la question.

  5. #5
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2016
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci à tous pour vos réponses.

    Ce n'est pas un exercice, c'est un extrait de l'annale 2016 du concours IESSA. Certaines de leurs questions sont piégeuses, comme le dit escartefigue.

    La réponse c. doit être valide car on utilise WHERE pour certaines formulations de JOIN, par exemple quand on veut exclure l'intersection des deux tables : WHERE A.idA IS NULL.

  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
    Citation Envoyé par escartefigue Voir le message
    Bien évidemment, la jointure codée à l'ancienne dans le WHERE n'est pas recommandée et elle est incompatible avec les jointures externes.
    Heureusement (pour nos seniors) c'est faux, le JOIN étant arrivé dans la norme SQL:92, les SGBDR savaient faire des jointures externes bien avant cela.
    • Sur Oracle : where a.id = b.id(+)
    • Sur Sybase (et SQL-Server 2000) : where a.id *= b.id

    Pour la petite histoire Oracle converti toujours la syntaxe OUTER JOIN en WHERE (+) pour l'exécution de la requête en interne.

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    Je confirme, je crois pouvoir revendiquer le statut "d'ancien", plutôt que "sénior" qui signifie simplement "adulte" .

    Mais sauf erreur de ma part, cette syntaxe est désormais obsolète sur la plupart des sgbd.

  8. #8
    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
    Comme souvent c'est conservé pour la rétrocompatibilité des applications.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select t1.banner
         , t2.dummy
      from v$version t1
         , dual      t2
     where t2.dummy (+) = t1.banner;
     
    BANNER                                                                  DUMMY
    ----------------------------------------------------------------------  -----
    Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production

  9. #9
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Oui, et d'ailleurs j'écris toujours mes requêtes comme ça sous Oracle

  10. #10
    Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2016
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 32
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2016
    Messages : 7
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci de venir apporter ces précisions. Donc vous confirmez que les réponses sont a. et c. en considérant la façon dont ils ont formulé la question ?

  11. #11
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    Stricto sensu, la jointure se fait avec l'opérateur JOIN.

    WHERE fait une restriction sur le produit cartésien en cas de codage à l'ancienne FROM T1, T2, ..., Tn
    Mais, l'optimiseur traduit le plus souvent (toujours ?) cette jointure à l'ancienne sous forme de vraie jointure pour n'avoir pas à faire le produit cartésien.

    Donc, pour moi c'est réponse A sûre et réponse C compte tenu des explications qui précèdent.

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Comme souvent c'est conservé pour la rétrocompatibilité des applications.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select t1.banner
         , t2.dummy
      from v$version t1
         , dual      t2
     where t2.dummy (+) = t1.banner;
     
    BANNER                                                                  DUMMY
    ----------------------------------------------------------------------  -----
    Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
    Testé à l'instant sur Oracle 11g, SQL server 2017, Postgre 11, MySQL 5.7 et 8.0 et DB2 V12 for Z/OS avec les anciennes syntaxes
    Seul oracle accepte l'ancienne version. Les quatre autres n'acceptent ni *= ni la syntaxe Oracle.

  13. #13
    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
    Belles recherches !
    Je savais que SQL-Server n'acceptait plus l'ancienne syntaxe depuis la refonte du moteur avec la version 2005, je pensais que DB2 serait un bon candidat pour la syntaxe vieillotte.

  14. #14
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 136
    Points : 38 561
    Points
    38 561
    Billets dans le blog
    9
    Par défaut
    DB2 for Z/OS non, mais DB2 LUW oui, l'un et l'autre sont significativement différents

  15. #15
    Membre chevronné
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 138
    Points : 1 918
    Points
    1 918
    Par défaut
    Je pense qu'Oracle accepte encore la vieille syntaxe car eux-mêmes doivent toujours avoir des vues système dont la requête utilise cette vieille syntaxe. Comme leur connerie de type LONG avec lequel tu ne peux rien faire, mais qui est toujours utilisé dans certaines vues système.

Discussions similaires

  1. Réponses: 3
    Dernier message: 03/03/2010, 19h05
  2. Utiliser des ALIAS de colonnes dans une jointure
    Par mbzhackers dans le forum SQL
    Réponses: 4
    Dernier message: 31/03/2008, 10h27
  3. Utilisation des Jointures Conditionnées
    Par Imad_ing dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 12/12/2007, 09h35
  4. requête utilisant les jointures et des UDT
    Par dingoth dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 25/04/2006, 16h22
  5. Peut on utiliser OR avec des jointures de tables??
    Par gins06 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 04/10/2005, 12h40

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