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 :

Jointures multiples sur une table


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 210
    Points : 87
    Points
    87
    Par défaut Jointures multiples sur une table
    Bonjour

    J'ai une table

    MAITRE avec un champ id

    et 3 tables ESC1, ESC2 et ESC3 qui ont la clé étrangère de MATRE.id

    comment faire la jointure du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select ESC1.name,  inner join MAITRE on ESC1.maitre_id = MAITRE.id
     inner join ESC2 on ESC2.maitre_id = MAITRE.id
    ?

    merci car pour le moment cela me retourne un nombre démesuré de lignes ?

    merci

  2. #2
    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,
    A moins d'une erreur de copier/coller, je ne vois pas comment cette requête peut renvoyer quoi que ce soit, vu qu'elle n'est syntaxiquement pas correcte !
    La bonne syntaxe est:
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select *
    from table1
    inner join table2 on table1.col1 = table2.col1
    inner join table3 on table3.col1 = table1.col1
    ...

    Tatayo.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 210
    Points : 87
    Points
    87
    Par défaut
    oui effectivement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT count(1)
    FROM table1
    INNER JOIN table2 ON table2.table1_id = table1.id     
    INNER JOIN table3 ON table3.table1_id = table1.id
    INNER JOIN table4 ON table4.table1_id = table1.id
    mon problème c'est que en exécutant cette requête j'ai plus de 3 000 000 de lignes alors que
    table1 contient 300 lignes
    table2 contient 7000 lignes
    table3 contient 8000 lignes
    table4 contient 5000 lignes


    c'est pas cohérent ...

    merci

  4. #4
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    C'est au contraire parfaitement logique :
    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
    SQL>   with t_maitre as (
      2  select 1 as id_maitre, 'toto' as c from dual union all
      3  select 2 as id_maitre, 'tata' as c from dual
      4  ),
      5         t_esc1 as (
      6  select 1 as id_esc1, 1 as id_maitre, 'truc1' as c1 from dual union all
      7  select 2 as id_esc1, 1 as id_maitre, 'truc2' as c1 from dual union all
      8  select 3 as id_esc1, 2 as id_maitre, 'truc3' as c1 from dual union all
      9  select 4 as id_esc1, 2 as id_maitre, 'truc4' as c1 from dual
     10  ),
     11         t_esc2 as (
     12  select 1 as id_esc2, 1 as id_maitre, 'chose1' as c2 from dual union all
     13  select 2 as id_esc2, 1 as id_maitre, 'chose2' as c2 from dual union all
     14  select 3 as id_esc2, 1 as id_maitre, 'chose3' as c2 from dual union all
     15  select 4 as id_esc2, 1 as id_maitre, 'chose4' as c2 from dual union all
     16  select 5 as id_esc2, 2 as id_maitre, 'chose5' as c2 from dual union all
     17  select 6 as id_esc2, 2 as id_maitre, 'chose6' as c2 from dual union all
     18  select 7 as id_esc2, 2 as id_maitre, 'chose7' as c2 from dual union all
     19  select 8 as id_esc2, 2 as id_maitre, 'chose8' as c2 from dual
     20  )
     21  select *
     22    from t_maitre t
     23    join t_esc1 e1 on e1.id_maitre = t.id_maitre
     24    join t_esc2 e2 on e2.id_maitre = t.id_maitre
     25  /
     
     ID_MAITRE C       ID_ESC1  ID_MAITRE C1       ID_ESC2  ID_MAITRE C2
    ---------- ---- ---------- ---------- ----- ---------- ---------- ------
             1 toto          2          1 truc2          1          1 chose1
             1 toto          1          1 truc1          1          1 chose1
             1 toto          2          1 truc2          2          1 chose2
             1 toto          1          1 truc1          2          1 chose2
             1 toto          2          1 truc2          3          1 chose3
             1 toto          1          1 truc1          3          1 chose3
             1 toto          2          1 truc2          4          1 chose4
             1 toto          1          1 truc1          4          1 chose4
             2 tata          4          2 truc4          5          2 chose5
             2 tata          3          2 truc3          5          2 chose5
             2 tata          4          2 truc4          6          2 chose6
             2 tata          3          2 truc3          6          2 chose6
             2 tata          4          2 truc4          7          2 chose7
             2 tata          3          2 truc3          7          2 chose7
             2 tata          4          2 truc4          8          2 chose8
             2 tata          3          2 truc3          8          2 chose8
     
    16 rows selected.
     
    SQL>
    A quoi correspondent les tables esc1,2,3 ?
    Quel est l'objectif de la requête ?

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2002
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2002
    Messages : 210
    Points : 87
    Points
    87
    Par défaut
    J'ai pas compris ce que tu a fait,

    Mais l'objectif de ma requete :

    J'ai une table avec sa cle primaire et 4 tables : , , ,qui ont chacune une cle étrangère qui qui pointent vers la clé primaire de la première table.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT count(1)
    FROM table1
    INNER JOIN table2 ON table2.table1_id = table1.id     
    INNER JOIN table3 ON table3.table1_id = table1.id
    INNER JOIN table4 ON table4.table1_id = table1.id

    je veux afficher donc le champ name de , , , apres la jointure des 4 table sur la clé primaire

    donc au max je ne peux avoir plus que les 8000 lignes de la table 3

    non ?

    merci

  6. #6
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    Non, mon exemple montre que pour toto (t_maitre), il y a truc1 et truc2 (dans t_esc1), ainsi que chose1, chose2, chose3, chose4 (dans t_esc2). La requête affiche donc les différentes combinaisons possibles de truc et de chose pour toto, donc :
    truc1,chose1
    truc1,chose2
    truc1,chose3
    truc1,chose4
    truc2,chose1
    truc2,chose2
    truc2,chose3
    truc2,chose4
    Il y a une sorte de produit cartésien entre esc1 et esc2 par id_maitre.
    Donc quel est l'objectif de la requête ? Ou comment décider des combinaisons à afficher?
    Y a t il par ailleurs des liens autres que l'id_maitre entre esc1,2,3 ?

    Par ailleurs quel est le SGBD avec sa version si possible ?

  7. #7
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    C'est normal que le nombre de lignes va se multiplier en aval.
    Et je trouve que la solution de skuatamad est correcte. sinon tu illustre ton bsoin en donnant un jeu de données.
    d'avoir Pensé à voter positivement pour ceux qui vous ont aidés et surtout à mettre si le cas.
    ça encourage.

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    allstar, ton besoin est incompréhensible !
    En supprimant tes balises codes inutiles pour reconstituer la phrase, ça donne ceci :
    je veux afficher donc le champ name de table1, table2, table3, table4
    Pour commencer, les champs sont à la campagne ou dans les formulaires, pas dans les tables SQL qui ne sont composées que de colonnes et de lignes.

    Ensuite, la colonne name n'est que dans la table1 (esc1 dans ta requête), si j'ai bien compris.

    Ce que je comprends de ta requête et de ton besoin mal exprimé, c'est que tu souhaites sélectionner les esc1.name distincts qui ont au moins une ligne en correspondance dans chacune des deux autres tables esc2 et esc3 via la table maitre.
    C'est ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT e1.name
    FROM esc1 e1
    INNER JOIN maitre m ON m.id = e1.maitre_id
    	INNER JOIN esc2 e2 ON e2.maitre_id = m.id
    	INNER JOIN esc3 e3 ON e3.maitre_id = m.id
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

Discussions similaires

  1. [WD15] Trie multiple sur une table
    Par Nodoka dans le forum WinDev
    Réponses: 1
    Dernier message: 20/08/2010, 16h32
  2. Jointures multiples sur une même table
    Par hjhjhj dans le forum Langage SQL
    Réponses: 10
    Dernier message: 08/05/2009, 16h48
  3. Projection multiple sur une table
    Par Mister Nono dans le forum Hibernate
    Réponses: 2
    Dernier message: 20/09/2007, 13h21
  4. relations multiples sur une table
    Par lapuce dans le forum Modélisation
    Réponses: 2
    Dernier message: 18/07/2007, 17h58
  5. Jointures externes sur une table de jointure
    Par mart1 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 10/10/2006, 01h33

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