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

Requêtes PostgreSQL Discussion :

select avec multiple jointures


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut select avec multiple jointures
    Bonjour,

    Je galère pour effectuer une requête avec des foreign_key. Le problème est qu'il ya des jointures imbriquées.
    Dans la table 1 il y a des enregistrement qui font références à x enregistrements dans table2. Dans la table2, il y a des références vers des id des table3 et 4.

    L'idée est de récupérer la liste des enregistrements de la table1 et des enregistrements associés à ce dernier. Exemple:
    id_table1, nom_table1, prenom_table1, telephone_table2, champ1_table3, champ2_table3, champ1_table4, champ2_table4

    table1
    =====
    id
    nom
    prenom

    table1_has_table2
    ============
    table1_id
    table2_id

    table2
    =====
    id
    telephone
    table3_id
    table4_id

    table3
    =====
    id
    champ1
    champ2

    table4
    =====
    id
    champ1
    champ2

    J'ai fait une super grosse requête pour ça, mais elle ne marche que s'il n'y a qu'un seul enregistrement dans la table1. Dès que j'en ajoute un autre, il me renvoi les infos de l'enregistrement 1 pour les tables 2,3 et 4:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select t1_id as t1_id,nom,prenom,
    	t2.telephone as t2_tel,
    	t3.champ1 as t3.champ2 as t3_champ2,
    	t4.champ1 as t4.champ2 as t4_champ2,
    	FROM table1 t1, table2 t2, table3 t3, table4 t4, table1_has_table2 t12
    	WHERE t2.id=t12.table2_id AND t2.table3_id=t3.id AND t2.table4_id=t4.id
    	GROUP BY t1.id,t2.id,t3.id,t4.id;
    Une idée sur la réalisation d'une telle requête ?

    Merci.

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 339
    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 339
    Points : 39 735
    Points
    39 735
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Faites comme ceci :

    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
    select t1_id        as t1_id
         , t1.nom       as t1_nom
         , t1.prenom    as t1_prn
         , t2.telephone as t2_tel
         , t3.champ1    as t3_c1 
         , t3.champ2    as t3_c2
         , t4.champ1    as t4.c1,
    FROM table1 t1
    inner join table1_has_table2 tt
       on tt.table1_id = t1.id
    inner join table2 t2
       on t2.id = tt.table2_id 
    inner join table3 t3
       on t3.id = t2.table3_id
    inner join table4 t4
       on t4.id = t2.table4_id
    Quelques remarques :
    - mettez en forme vos requetes, c'est plus facile à lire, donc à comprendre et à maintenir
    - quand vous utilisez des colonnes provenant de nombreuses tables, il est préférable de mentionner explicitement dans le select quelle colonne est prise dans quelle table :
    SELECT T1.col1 et non SELECT COL1 ca évite de se poser des questions sur l'origine des infos
    - les jointures se font par l'instruction JOIN, les jointures mélangées aux critères de filtrage (WHERE) nuisent à la lisibilité
    - faire un groupage alors que vous n'utilisez aucune fonction d'aggrégation n'a aucun intérêt, de plus, le GROUP BY doit être cohérent avec les colonnes du SELECT.
    MySQL est à ma connaissance le seul SGBD qui tolère une incohérence entre GROUP BY et SELECT, mais il restitue "ce qu'il veut" en ce cas pour les colonnes SELECT non cohérentes... à vos risques et périls
    - remplacez éventuellement les jointures INNER par des jointures OUTER pour les tables qui seraient facultatives
    - un petit tour du coté de la FAQ vous rendrait service, c'est ici http://www.developpez.net/forums/d68...q-langage-sql/

  3. #3
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    ok, j'ai testé cette requête avec les JOIN et en retirant les group. J'ai 2 entrées dans la table1.

    La première ligne retournée semble correcte, mais sur la seconde, les champs t1_id, t1_nom et t1 prn sont correctes et les autres champs
    affichent exactement les mêmes valeurs que la première ligne. Sauf que le contenu pour ce second enregistrement est bien différent de la première.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     t1_id| t1_nom   | t1_prn      | t2_tel          |  t3_c1     | t3_c2
    ------+-----------+------------+---------------+-----------+-----------------
    1      | charles   | pierre       | 0000000000  | champ1  | champ2
    2      | jean       | petit         | 0000000000  | champ1  | champ2
    Normalement sur la second ligne je devrai avoir un vrai numéro et des valeurs différents pour t3_c1 et t3_c2.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 339
    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 339
    Points : 39 735
    Points
    39 735
    Billets dans le blog
    9
    Par défaut
    Communiquez un extrait de chacune de vos tables, avec les différentes colonnes de jointure

  5. #5
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    euh vous allez rire ... ou pas ...: c'est normal qu'il me sortait la même chose car j'avais le même id pour table1_has_table2.table2_id pour les 2 enregistrements

    Donc ça marche MErcciiiiii

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 339
    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 339
    Points : 39 735
    Points
    39 735
    Billets dans le blog
    9
    Par défaut
    Je me disais aussi
    Merci d'avoir donné l'explication en tout cas

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 20/03/2015, 12h45
  2. Requête SQL avec multiples jointures
    Par CedriZero dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/01/2014, 15h29
  3. Delete + selection avec jointure
    Par kluh dans le forum Oracle
    Réponses: 4
    Dernier message: 15/11/2005, 10h44
  4. Problème performance SELECT avec jointure
    Par Netgamer dans le forum Requêtes
    Réponses: 7
    Dernier message: 05/08/2005, 10h20
  5. pb de select avec size avec choix multiple
    Par La_picolle dans le forum ASP
    Réponses: 10
    Dernier message: 28/08/2003, 15h21

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