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 :

selection a travers des clé étranger


Sujet :

Langage SQL

  1. #1
    Membre du Club Avatar de restart
    Inscrit en
    Novembre 2009
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 84
    Points : 49
    Points
    49
    Par défaut selection a travers des clé étranger
    bonjour
    j'ai fait le concept d'une base de donnée en utilisant AMC designer et en se basant sur le model conceptuel que vous voyez dans la photo
    mon probleme c'est que aprés avoir gérer la base de donnée et insérer les données souhaiter dans les tables
    j'arrive pas a comprendre comment gérer des condition pour écrire une commonde select qui permet de selectionner la liste des exemplaire emprunter par l'etdueint dont le NCE est 125
    j'ai utiliser les deux commondes suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select emprunter.numinv, livre.code_livre, livre.titre, 
      emprunter.dateempr, emprunter.nce
    from livre, emprunter, exemplaire
    where emprunter.nce = 125;
    et la deusieme commonde est:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select emprunter.numinv, livre.code_livre, livre.titre, 
      emprunter.dateempr, emprunter.nce
    from livre, emprunter, exemplaire
    where emprunter.nce = 125 
      and emprunter.numinv = exemplaire.numinv 
      and exemplaire.code_livre = livre.code_livre;

    la premiere commonde me donne tous les exemplaire (pris ou non pris par l'etudient
    alors que la deusieme me donne le resultat valide
    je comprend pas pourquoi je doix ajouter les deux condition emprunter.numinv=exemplaire.numinv et exemplaire.code_livre=livre.code_livre
    pour que la requete fonctionne normalement
    es se que quelqu'un pourrais me donner de l'explication svp
    merci
    Images attachées Images attachées  

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Dans ta première requête, tu fais un produit cartésien des trois tables puisqu'il n'y a aucune condition de jointure. En d'autres termes, le SGBD assemble toutes les combinaisaons possibles des groupes de colonnes issus des trois tables. Ca peut vite faire beaucoup de lignes à traiter !

    Dans la seconde requête, les conditions supplémentaires que tu as mises permettent de dire au SGBD comment relier les tables entre elles.

    Dans les deux cas, tu utilises une syntaxe pour les jointures qui est obsolète depuis 17 ans !

    Voici ta requête réécrite avec la bonne syntaxe pour les jointures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT x.numinv, l.code_livre, l.titre, x.dateempr, x.nce
    FROM livre AS l
    INNER JOIN emprunter AS e ON e.code_livre = l.code_livre
      INNER JOIN exemplaire AS x ON e.numinv = x.numinv 
    WHERE e.nce = 125
    Cette syntaxe sépare bien les jointures (JOIN) des restrictions (WHERE).

    Cette syntaxe est aussi plus facile à lire :
    Je sélectionne certaines colonnes de la table livre, jointe à la table emprunter sur la condition d'égalité du code_livre, et la table emprunter est elle-même jointe à la table exemplaire sur la condition d'égalité des numinv. Enfin, je restreins les lignes au nce = 125.

    Au passage, j'ai également utilisé des alias pour simplifier la lecture de la requête.

  3. #3
    Membre du Club Avatar de restart
    Inscrit en
    Novembre 2009
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 84
    Points : 49
    Points
    49
    Par défaut
    excellent travail
    la méthaude interne est vraiment exceptionnel
    mais malgré que j'ai lu le cour je comprend pas comment tu as fai un choix sur les jointures
    j'explique ce que j'ai pas compris :
    j'ai vue que tu as mis la condition e.nce = 125 en dernier lieu dans la close where

    comment tu a su a partir de ce qui es écrit qu seul les clé étranger code livre et numinv sont les seuls a intervenir dans la requete
    pour quoi tu n'as pas fait une jointure de la clé étranger NCE de la table Emprunter avec la clé primere NCE de etudient,par exemple, malgré qu'elle cette clé existe dans la requete


    es se que tu peux m'expliquer comment tu as deduit a partir de la lecture de ce qui es demander ... que tu peux résoudre le probleme de cette maniere
    j'ai vraiment envie de comprendre cette maniere d'interpréter les conditions
    merci

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par restart Voir le message
    comment tu a su a partir de ce qui es écrit qu seul les clé étranger code livre et numinv sont les seuls a intervenir dans la requete
    En fait je n'ai pas cherché, j'ai juste remis en forme ta seconde requête.

    pour quoi tu n'as pas fait une jointure de la clé étranger NCE de la table Emprunter avec la clé primere NCE de etudient,par exemple, malgré qu'elle cette clé existe dans la requete
    Je n'y ai même pas réfléchi !
    A vrai dire, je n'ai même pas regardé ton MCD !


    es se que tu peux m'expliquer comment tu as deduit a partir de la lecture de ce qui es demander ... que tu peux résoudre le probleme de cette maniere
    j'ai vraiment envie de comprendre cette maniere d'interpréter les conditions
    merci
    Bon je vais faire un effort supplémentaire !

    Je reprends ton besoin de départ :
    sélectionner la liste des exemplaires empruntés par l'etudiant dont le NCE est 125
    Le NCE se trouve dans la table des étudiants mais aussi en tant que clé étrangère dans la table 'emprunter' issue de l'association figurant sur le MCD. Comme on connait le numéro de l'étudiant qu'on cherche et qu'il figure dans la table 'emprunter, on n'a même pas besoin de faire la jointure entre la table des étudiants et la table emprunter.

    Par contre, puisqu'on veut afficher le titre et le code du livre, on doit utiliser la jointure entre 'emprunter' et 'exemplaire', ainsi que celle entre 'exemplaire' et 'livre'.

    La condition de jointure entre deux tables se fait avec la (cardinalités 1,1 - 0,n) ou les (cardinalités 0,n - 0,n) clé(s) étrangère(s) et à l'identifiant de l'autre table auquel elle fait (font) référence.

    L'association 'possede' entre 'livre' et 'exemplaire', de cardinalité (1,1 - 1,n), a engendré une clé étrangère dans la table 'exemplaire' qui fait référence à la clé primaire (l'identifiant) de la table 'livre'.
    La jointure entre les deux tables s'écrit donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM livre AS l
    INNER JOIN exemplaire AS x ON l.code_livre = x.code_livre
    L'association 'emprunter' entre 'exemplaire' et 'etudiant', de cardinalité (0,n - 0,n), a engendré la création d'une table associative dont la clé primaire est constituée de deux clés étrangères faisant référence aux identifiants des deux tables.
    Cette clé primaire est donc composée de 'numinv' (venant de 'exemplaire') et de 'NCE' (venant de 'etudiant'.
    La jointure entre 'exemplaire' et 'emprunter' s'écrit donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM exemplaire AS x
    INNER JOIN emprunter AS e ON x.numinv = e.numinv
    Les deux jointures reproduisent en fait le schéma :
    livre -1,n----posséder----1,1- exemplaire -0,n----emprunter
    (on ne termine pas la dernière association puisque l'info NCE figure dans l'identifiant de l'association emprunter)
    Les deux jointures ensemble donnent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    FROM livre AS l
    INNER JOIN exemplaire AS x ON l.code_livre = x.code_livre
      INNER JOIN emprunter AS e ON x.numinv = e.numinv
    Le parcours des jointures permet de redessiner le MCD.

    Il ne reste plus qu'à choisir les colonnes et mettre la restriction sur l'étudiant n° 125 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT l.code_livre, l.titre,
      x.numinv,
      e.dateempr
    FROM livre AS l
     INNER JOIN exemplaire AS x ON l.code_livre = x.code_livre
      INNER JOIN emprunter AS e ON x.numinv = e.numinv
    WHERE e.NCE = 125
    Cette requête diffère d'ailleurs de celle que j'avais écrite précédemment mais devrait donner un résultat plus rigoureux.

  5. #5
    Membre du Club Avatar de restart
    Inscrit en
    Novembre 2009
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 84
    Points : 49
    Points
    49
    Par défaut

    encore une petite chose que j'arrive pas a interprété
    pour qu'il n y a pas une redandance de donnée (une répétition de donnée ) dans le resultat donnée par la requete, j'ai lu que je doit mettre l'operateur distinct dan la collomun select
    c'est fait mais il y as toujours des données qui sont répéter
    es se qu'il y a une explication pour cela ou une maniere pour le resoudre

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 801
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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 801
    Points : 34 063
    Points
    34 063
    Billets dans le blog
    14
    Par défaut
    DISTINCT fonctionne au niveau de la ligne de drésultat.

    Si je cherche, non pas les exemplaires, mais les codes et titres des livres empruntés par l'étudiant 125 et qu'il a emprunté plusieurs fois le même livre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT l.code_livre, l.titre
    FROM livre AS l
     INNER JOIN exemplaire AS x ON l.code_livre = x.code_livre
      INNER JOIN emprunter AS e ON x.numinv = e.numinv
    WHERE e.NCE = 125
    Il y aura plusieurs lignes de résultat totalement identiques.
    En ajoutant DISTINCT, je n'aurai qu'une fois chaque livre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT DISTINCT l.code_livre, l.titre
    FROM livre AS l
     INNER JOIN exemplaire AS x ON l.code_livre = x.code_livre
      INNER JOIN emprunter AS e ON x.numinv = e.numinv
    WHERE e.NCE = 125
    Mais dans la requête que j'ai donnée, à moins que l'étudiant 125 ait emprunté deux fois dans la même journée le même exemplaire du même livre, il ne peut pas y avoir deux lignes identiques. Le DISTINCT est donc inutile et de plus coûteux en temps d'exécution de la requête.

    Il faudrait donc que tu donnes la requête exacte que tu as lancée et un exemple de résultat que tu trouves redondant pour qu'on comprenne le problème.

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

Discussions similaires

  1. [SQL] Contrôle "Select" et liste des options
    Par Cantalou dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 02/12/2006, 20h31
  2. [SimpleXML] Récupérer des mots étrangers dans XML
    Par yamayo dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 23/11/2006, 23h25
  3. Réponses: 2
    Dernier message: 26/10/2006, 17h52
  4. calculer à travers des lignes de dbgrid
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 2
    Dernier message: 25/07/2005, 11h55
  5. Select, union, éliminer des résultats.
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 10/06/2004, 09h42

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