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 :

affichage d'un select concernant plusieurs tables


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut affichage d'un select concernant plusieurs tables
    Bonjour,
    j'ai un petit souci d'affichage d'une requête select,
    et j'aimerais vous en exposer le contenu,
    pour voir ce qui pourrait être fait.

    Voilà, pour simplifier,
    j'ai 3 tables.

    -1ere table:
    - contient des champs du type:
    ----------------------------------------
    table1_id | table1_nom | table1_prenom |
    ----------------------------------------
    1 | dupond | marc |
    ----------------------------------------
    2 | doe | john |
    ----------------------------------------

    2eme table:
    - contient des champs du type:

    ----------------------------------------
    table2_id | table2_livre | table2_genre |
    ----------------------------------------
    1 | asterix | BD |
    ----------------------------------------
    2 | bidon | roman |
    ----------------------------------------

    3eme table:
    - contiendrait :
    ----------------------------------------
    table3_id | table1_id | table2_id |
    ----------------------------------------
    1 | 1 | 2 |
    ----------------------------------------
    2 | 2 | 1 |
    ----------------------------------------

    Ne tenez pas compte des données en tant que tel,
    j'ai inventé sur le tas, c'est le principe de ce que je cherche à obtenir à l'affichage que j'aimerais vous exposer.

    Alors en fait, j'aimerais obtenir, en faisant un select de la table 3,
    l'affichage des données correspondantes aux tables 1 et 2.

    Et je ne sais pas comment faire,
    car il faudrait pouvoir afficher à la place de table1_id, les champs table1_nom et table1_prenom,
    et aussi afficher à la place de table2_id, les champs table2_livre et table2_genre.

    Pour obtenir d'après les données de la table 3, un tableau de ce style :

    -----------------------------------------------------------
    table1_nom | table1_prenom | table2_livre | table2_genre |
    -----------------------------------------------------------
    dupond | marc | bidon | roman |
    -----------------------------------------------------------
    doe | john | asterix | BD |
    -----------------------------------------------------------

    Voilà, merci d'avance pour votre aide,
    et n'hésitez pas à me dire si je pars dans une mauvaise réflexion,
    car je débute et je n'ai fait que de l'autoformation pour le moment.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Pour bien débuter en SQL : Le Cours SQL de SQLPro
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    bonjour,

    tout d'abord j'aimerais préciser que malgré le fait que je suis débutant,
    j'ai lu plusieurs fois les documentations diverses,

    mais j'aimerais au moins qu'on me dise si ma façon de créer mes tables est correcte,
    ou si au contraire, j'ai un problème de conception.

    j'espère que quelqu'un prendra le temps de me répondre autre chose que "la doc est là",
    car ca fait plusieurs semaines que je bloque.

    voilà, merci d'avance.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Janvier 2008
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    je pense que tu devrai avoir un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select table1_nom,table_1prenom,table2_livre, table2_genre from table1 left outer join table3 right outer join table2;

  5. #5
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par novice_du_11
    j'aimerais au moins qu'on me dise si ma façon de créer mes tables est correcte,
    ou si au contraire, j'ai un problème de conception.
    La façon de créer les tables est correcte. Mais pour modéliser, utilisez un outil du genre Toad Data Modeler (gratuit) ou DBDesigner (gratuit).

    Quant à la façon d'obtenir le résultat, raisonnez ainsi :

    1) je procède à la jointure naturelle des tables table1 et table3 (jointure sur les attributs communs).

    2) je procède à la jointure naturelle de la table résultat et de la table table2.

    3) j'effectue une projection du résultat sur les colonnes que je veux afficher.

    4) je traduis tout cela, de manière déclarative à l'aide d'une requête SQL.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    La façon de créer les tables est correcte. Mais pour modéliser, utilisez un outil du genre Toad Data Modeler (gratuit) ou DBDesigner (gratuit).

    Quant à la façon d'obtenir le résultat, raisonnez ainsi :

    1) je procède à la jointure naturelle des tables table1 et table3 (jointure sur les attributs communs).

    2) je procède à la jointure naturelle de la table résultat et de la table table2.

    3) j'effectue une projection du résultat sur les colonnes que je veux afficher.

    4) je traduis tout cela, de manière déclarative à l'aide d'une requête SQL.
    j'ai suivi votre conseil,
    et je suis arrivé à faire cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT a.table1_nom, a.table1_prenom, b.table2_livre, b.table2_genre
    FROM table1 a, table2 b
    JOIN table3 c ON a.table1_id = c.table1_id AND b.table2_id = c.table2_id
    et j'obtiens ceci :

    table1_nom//table1_prenom//table2_livre//table2_genre
    dupond//marc//bidon//roman
    doe//john//asterix//BD


    Voilà, je pense que c'est correct,
    et donc si vous me confirmez,
    le sujet sera clos


    en tout cas, merci de vos réponses,
    et plus particulièrement un grand merci à fsmrel

  7. #7
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Hum...

    Quand vous écrivez
    FROM table1 a, table2 b
    vous opérez avec un produit cartésien et non pas une jointure naturelle, puisque les 2 tables n'ont aucun élément en commun.

    Je rappelle, on marie d'abord table1 et table3, puis table3 et table2 (ou vous mariez d'abord table2 et table3, peu importe). Pour mémoire, la jointure naturelle est associative et commutative...

    => revoir
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Je rappelle, on marie d'abord table1 et table3, puis table3 et table2 (ou vous mariez d'abord table2 et table3, peu importe). Pour mémoire, la jointure naturelle est associative et commutative...

    => revoir
    Pourriez-vous alors me donner un gabarit générique des requêtes que vous cherchiez à me faire trouver dans ce cas, s'il vous plait,
    car je ne vois pas comment procéder sinon.

    Merci.

  9. #9
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Citation Envoyé par novice_du_11
    Pourriez-vous alors me donner un gabarit générique des requêtes que vous cherchiez à me faire trouver
    A) En algèbre relationnelle, l'opérateur de jointure naturelle s'appelle JOIN et permet de marier deux tables, les tender foreplays se faisant sur la base des noms identiques des attributs des deux tables.

    Concernant l'amorce de la pompe, on procède donc au mariage de table1 et table3 (sous-entendu donc, sur la base des noms identiques, à savoir table1_id) :
    table1 JOIN table3
    Appelons T le bébé issu de ce mariage. T est en réalité une table dont l’en-tête (ou schéma, ou intension, notez l’orthographe) est composé des noms des attributs des mariés : table1_id, table1_nom, table1_prenom, table3_Id, table2_id (table1_id ne figure qu’une seule fois, car cet en-tête est un ensemble). Le corps de la table T (l’ensemble des lignes qui la constituent) est la concaténation des lignes de table1 et table3 pour lesquelles les valeurs des colonnes table1_id sont égales.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    T (table1_id  table1_nom  table1_prenom  table3_id  table2_id)
         1          dupond        marc          1         2
         2          doe           john          2         1

    Il faut dans un 2e temps marier ce bébé avec table2 :
    T JOIN table2
    Le bébé U résultant de ce mariage est encore une table dont la constitution suit les mêmes règles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    U (table1_id  table1_nom  table1_prenom  table3_id  table2_id  table2_livre  table2_genre)
         1          dupond        marc          1         2           bidon         roman
         2          doe           john          2         1           asterix       BD
    La projection finale appliquée à U permet de ne retenir que la partie qui vous intéresse (nom, prénom, livre, genre).

    B) La norme SQL propose une syntaxe voisine. Au lieu d’écrire :
    table1 JOIN table3
    vous écrirez
    table1 NATURAL JOIN table3
    ou encore
    table1 INNER JOIN table3 USING (table1_id)
    C) Votre SGBD peut vous imposer une autre syntaxe. Par exemple SQL Server 2005 ne reconnaît pas l’expression "NATURAL JOIN" (pas plus que "USING"), aussi vous écrirez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    table1 INNER JOIN table3 
             ON table1.table1_id = table3.table1_id
    D) Comme SQL n’est pas procédural mais déclaratif, vous êtes obligé de tout lui fournir d’un coup et je pense que votre difficulté réside ici. Comme je vous l’avais déjà dit, la jointure naturelle est associative et vous pouvez coder :

    — Dans le cadre de l’algèbre relationnelle :
    table1 JOIN table3 JOIN table2
    — Dans le cadre de SQL Server :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    table1 INNER JOIN table3 
             ON table1.table1_id = table3.table1_id
           INNER JOIN table2
             ON table3.table2_id = table2.table2_id
    Si j’ai fait de mauvais copier/coller, à vous de rectifier...
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    et bien,
    je suis soufflé !

    votre explication est très explicite,
    et va, je pense, beaucoup m'aider dans la suite de ce que j'entreprends.

    Merci beaucoup de votre précieuse aide !


  11. #11
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir novice_du_11,


    Nous sommes tous passés par là. Mon but est de vous aider, ainsi que tous ceux qui auront suivi cette discussion jusqu'au bout et qui se posaient le même genre de question. A votre tour, n'hésitez pas à filer un coup de main aux autres et exercez-vous aux requêtes proposées par SQLpro.

    A votre service, et que la mayonnaise prenne !

    fsmrel
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

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

Discussions similaires

  1. select sur plusieurs tables
    Par julien.63 dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/05/2006, 17h29
  2. [SQL Access] SELECT sur plusieurs Tables et Composer Champs
    Par Giuseppe dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 07/11/2005, 14h00
  3. SELECT sur plusieurs Tables et Composer Champs
    Par Giuseppe dans le forum Langage SQL
    Réponses: 4
    Dernier message: 07/11/2005, 12h27
  4. un seul SELECT sur plusieurs tables ?
    Par deloo dans le forum Requêtes
    Réponses: 2
    Dernier message: 15/09/2005, 12h57
  5. select sur plusieurs table, question sur jointure
    Par Schulman dans le forum Langage SQL
    Réponses: 7
    Dernier message: 03/09/2004, 13h54

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