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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 205
    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 205
    Points : 12 786
    Points
    12 786
    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 ?

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