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 :

NATURAL JOIN imbriqués


Sujet :

Langage SQL

  1. #1
    Membre averti
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Septembre 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2003
    Messages : 302
    Points : 331
    Points
    331
    Par défaut NATURAL JOIN imbriqués
    J'ai découvert récemment la jointure naturelle et j'avoue que j'ai adoré pour la simplicité de la syntaxe et la clarté de mes requetes.
    Ma question est : peut-on utiliser des NATURAL JOIN imbriqués ?
    Je vais donner mon exemple :

    4 tables : t_student, t_period, t_admissionfolder, t_trimester
    dans la table t_period on a comme clés étrangères les 3 autres tables (les champs des clés étrangères ont bien évidemment le même nom que les clés primaires des 3 autres tables)

    je voudrais faire une requete du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT t_student.* FROM t_student NATURAL JOIN t_period NATURAL JOIN t_admissionfolder NATURAL JOIN t_trimester WHERE ...
    Je sais que cette requete ne marche pas mais est-il possible d'imbriquer des NATURAL JOIN ? J'ai réussi à faire ma requete avec des INNER JOIN mais la clarté en prend un coup

    voili voilou pour la question ...

    Merci d'avance

  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 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Voyez si le SGBDR que vous utilisez supporte la clause USING du NATURAL JOIN.

    Lisez l'article que j'ai écrit à ce sujet :
    http://sqlpro.developpez.com/cours/s...ointures/#L2.1

    a +

  3. #3
    Membre averti
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Septembre 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2003
    Messages : 302
    Points : 331
    Points
    331
    Par défaut
    j'avais déjà lu cet article mais ce que j'ai compris c'est que l'option USING sert lorsque l'on a plusieurs champs dont le nom est identique dans les 2 tables que l'on veut joindre.

    Pour moi le souci est différent : je voudrai savoir si je peux transformer cette requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT 
      t_student.s_name, t_student.s_firstname, cast(f_complete_promo(t_period.p_uid) as varchar(100)) AS promo, t_trimester.tri_name, t_period.per_session  
     FROM t_student
     INNER JOIN (t_period INNER JOIN t_trimester ON (t_period.tri_id = t_trimester.tri_id) 
     INNER JOIN t_admissionfolder ON (t_admissionfolder.per_id = t_period.per_id)) ON (t_student.u_id = t_period.u_id)
     WHERE t_student.s_name LIKE '$param_namestudent' AND t_student.s_firstname LIKE '$param_firstnstudent';
    en une requete du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT t_student.* 
    FROM t_student 
    NATURAL JOIN t_period NATURAL JOIN t_admissionfolder NATURAL JOIN t_trimester 
    WHERE ...
    Pour info j'utilise le SGBDR postgresql 8.0


    ++

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Pouvez-vous respecter les règles de postage décrites ici :
    http://www.developpez.net/forums/viewtopic.php?t=32668
    notamment en donnant les requêtes DDL permettant de créer vos tables ?

    A +

  5. #5
    Membre averti
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Septembre 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2003
    Messages : 302
    Points : 331
    Points
    331
    Par défaut
    maxima mea culpa

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    CREATE TABLE t_student
    (
      u_id serial NOT NULL,
      s_idstudent varchar(20),
      s_civ varchar(20),
      s_name varchar(200),
      s_firstname varchar(200),
     ...
      CONSTRAINT t_student_pkey PRIMARY KEY (u_id),
      CONSTRAINT t_student_s_idstudent_key UNIQUE (s_idstudent)
    ) 
     
    CREATE TABLE t_period
    (
      per_id serial NOT NULL,
      o_id int4,
      tri_id int4 NOT NULL,
      y_id int4 NOT NULL,
      u_id int4 NOT NULL,
      p_uid int4 NOT NULL,
      per_current bool,
    ...  
    CONSTRAINT t_period_pkey PRIMARY KEY (per_id),
      CONSTRAINT t_period_o_id_fkey FOREIGN KEY (o_id)
          REFERENCES t_option (o_id) MATCH SIMPLE
          ON UPDATE RESTRICT ON DELETE RESTRICT,
      CONSTRAINT t_period_p_uid_fkey FOREIGN KEY (p_uid)
          REFERENCES t_promo (p_uid) MATCH SIMPLE
          ON UPDATE RESTRICT ON DELETE RESTRICT,
      CONSTRAINT t_period_tri_id_fkey FOREIGN KEY (tri_id)
          REFERENCES t_trimester (tri_id) MATCH SIMPLE
          ON UPDATE RESTRICT ON DELETE RESTRICT,
      CONSTRAINT t_period_u_id_fkey FOREIGN KEY (u_id)
          REFERENCES t_user (u_id) MATCH SIMPLE
          ON UPDATE RESTRICT ON DELETE RESTRICT,
      CONSTRAINT t_period_y_id_fkey FOREIGN KEY (y_id)
          REFERENCES t_year (y_id) MATCH SIMPLE
          ON UPDATE RESTRICT ON DELETE RESTRICT,
      CONSTRAINT periodkey UNIQUE (o_id, tri_id, y_id, u_id, p_uid)
    ) 
     
    CREATE TABLE t_trimester
    (
      tri_id serial NOT NULL,
      tri_name varchar(20),
      tri_describe varchar(50),
      p_uid int4,
      CONSTRAINT t_trimester_pkey PRIMARY KEY (tri_id),
      CONSTRAINT t_trimester_p_uid_fkey FOREIGN KEY (p_uid)
          REFERENCES t_promo (p_uid) MATCH SIMPLE
          ON UPDATE RESTRICT ON DELETE RESTRICT
    ) 
     
    CREATE TABLE coconut.t_admissionfolder
    (
      a_id serial NOT NULL,
      per_id int4 NOT NULL,
      a_registerdate date,
      a_comment text,
      ...
    CONSTRAINT t_admissionfolder_pkey PRIMARY KEY (a_id),
      CONSTRAINT fkey_formula FOREIGN KEY (f_id)
          REFERENCES coconut.t_formula (f_id) MATCH SIMPLE
          ON UPDATE RESTRICT ON DELETE RESTRICT,
      CONSTRAINT t_admissionfolder_is_id_fkey FOREIGN KEY (is_id)
          REFERENCES coconut.t_informativesource (is_id) MATCH SIMPLE
          ON UPDATE RESTRICT ON DELETE RESTRICT
    )
    voici donc la structure de mes tables.

  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
    21 920
    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 920
    Points : 51 712
    Points
    51 712
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT t_student.s_name, t_student.s_firstname, 
           cast(f_complete_promo(t_period.p_uid) as varchar(100)) AS promo, 
           t_trimester.tri_name, t_period.per_session 
     
    FROM   t_student
           NATURAL JOIN t_period USING u_id 
           NATURAL JOIN t_trimester  USING tri_id 
           NATURAL JOIN t_admissionfolder USING per_id
     
    WHERE  t_student.s_name LIKE '$param_namestudent' 
      AND  t_student.s_firstname LIKE '$param_firstnstudent'
    A +

  7. #7
    Membre averti
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Septembre 2003
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant ERP
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2003
    Messages : 302
    Points : 331
    Points
    331
    Par défaut
    merci beaucoup mais après lecture de la doc de postgres il me semble que le using ne soit pas géré
    T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 ON expression_booleenne
    T1 { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2 USING ( liste des colonnes jointes )
    T1 NATURAL { [INNER] | { LEFT | RIGHT | FULL } [OUTER] } JOIN T2
    En tout cas merci quand même.

    A+

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 15/11/2006, 16h35
  2. impossibilité d'enchaîner les NATURAL JOIN
    Par ctobini dans le forum Langage SQL
    Réponses: 1
    Dernier message: 14/09/2006, 18h24
  3. [MySQL] INNER & OUTER JOIN imbriqués avec WHERE
    Par kelson dans le forum Langage SQL
    Réponses: 1
    Dernier message: 28/02/2006, 13h00
  4. INNER JOIN , NATURAL JOIN : quelle différence?
    Par cladsam dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/02/2006, 18h05
  5. Requête avec NATURAL JOIN
    Par blids dans le forum SQL
    Réponses: 4
    Dernier message: 06/08/2004, 12h52

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