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 :

Requête avec NATURAL JOIN


Sujet :

SQL Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 154
    Points : 98
    Points
    98
    Par défaut Requête avec NATURAL JOIN
    Salut tout le monde,
    Je travail sur le sechma (employees, departments et locations) founit par les exemple de Oracle sur la 9i.

    Et j'ai trois requête à comparer :
    requête 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT last_name, job_id, d.department_id, department_name
    FROM   hr.employees e JOIN hr.departments d
           ON(e.department_id=d.department_id)
           JOIN hr.locations l 
           ON(d.location_id=l.location_id)
    WHERE l.city = 'Toronto';
    reuqête 2:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT last_name, job_id, d.department_id, department_name
    FROM   hr.departments d, hr.employees e, hr.locations l
    WHERE l.city = 'Toronto'
    AND   e.department_id=d.department_id
    AND   d.location_id = l.location_id;
    Les deux premières me donnent le même résultat qui est le suivant :
    Hartstein MK_MAN 20 Marketing
    Fay MK_REP 20 Marketing

    Par contre la reuqête 3:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT last_name, job_id, department_id, department_name
    FROM   hr.employees NATURAL JOIN (hr.departments
           NATURAL JOIN hr.locations)
    WHERE  city = 'Toronto';
    Ne me donne pas le même résultat ..!! mais je ne sais pas pourquois ..!!
    elle retourne une seule ligne :
    Fay MK_REP 20 Marketing

    Pour moi elle est sencée me donner le même résultat des deux premières requêtes ...!!

    Merci pour vos réponses.

  2. #2
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Points : 8 078
    Points
    8 078
    Par défaut
    La jointure "naturelle", c'est spécialement casse-gueule, et de mon point de vue à ne surtout pas utiliser.

    La jointure naturelle consiste à faire une équijointure entre les champs des 2 tables qui ont le même nom, et le même type.
    Si plusieurs champs sont communs entre les deux tables, ils servent tous comme condition de jointure.

    Entre EMPLOYEES et DEPARTMENTS, il y a 2 champs communs : DEPARTMENT_ID et MANAGER_ID.
    La jointure naturelle entre ces 2 tables revient à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...FROM hr.employees e JOIN hr.departments d 
           ON(e.department_id=d.department_id and e.manager_id=d.manager_id)
    ce qui n'est pas la même chose que votre requête 1 !

    Si on veut spécifier quelles colonnes doivent participer à la jointure, il existe une syntaxe allégée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ...FROM hr.employees e JOIN hr.departments d 
           USING (department_id)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 154
    Points : 98
    Points
    98
    Par défaut
    Oui, effectivement il y avais deux colonnes qui avaient le même nom entre les deux tables.... j'ai pas fait attention à manager_id...
    dans ce cas là ça s'explique pourquois le résultat de ma requête n'est pas le même par rapport aux autres.

    Mais à l'occasion je voulais savoir, tu disais que la jointure natural ce fait entre toutes les colonnes (entre les deux tables) qui ont le même nom et le même type...
    Dans la doc officiel en français ils parlent aussi du type, par contre dans la doc en ligne en anglais ils parlent uniquement de nom de colonne mais pas de type

    NATURAL JOIN
    The NATURAL keyword indicates that a natural join is being performed. A natural join is based on all columns in the two tables that have the same name. It selects rows from the two tables that have equal values in the relevant columns. When specifying columns that are involved in the natural join, do not qualify the column name with a table name or table alias.
    Cela est-il lié aux versions ...!!?
    Moi j'arrive à faire une jointure natural entre des colonnes qui sont pas de même type sur la 9i.

  4. #4
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Points : 8 078
    Points
    8 078
    Par défaut
    Exact !
    Moi je tenais cette information de mon guide de préparation pour la certification 9i, mais c'est manifestement une erreur : le type des colonnes n'est pas pris en compte pour les jointures naturelles.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    154
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 154
    Points : 98
    Points
    98
    Par défaut
    Ok Merci c'est bien noté

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

Discussions similaires

  1. Requête imbriquée avec NATURAL JOIN
    Par zoubazouba40 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 10/02/2014, 12h07
  2. Ma requête avec INNER JOIN
    Par vocal94130 dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/08/2010, 09h23
  3. [MySQL] Requête avec inner join
    Par kate59 dans le forum PHP & Base de données
    Réponses: 21
    Dernier message: 19/02/2008, 17h28
  4. Requête avec deux JOIN
    Par Tintou dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 26/09/2007, 18h03
  5. requête avec inner join ?
    Par Melvine dans le forum Oracle
    Réponses: 5
    Dernier message: 30/03/2006, 09h16

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