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 :

problème liaison entre les tables


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 80
    Points
    80
    Par défaut problème liaison entre les tables
    Bonjour,

    j'aurais aimé savoir s'il est possible de lier plusieurs clés étrangères d'une même table vers la même clé.

    En effet, mes tables sont :
    Table match(n_match, date, n_equipeA, n_equipeB)
    Table équipe(n_equipe, nom_equipe, nb_joueur...)

    Et en fait, j'aurais besoin de lier n_equipeA et n_equipeB de la table match vers n_equipe de la table équipe. Quelqu'un sait-il comment je pourrai faire et s'il est possible de faire un double lien et si cela ne créé pas des erreurs..

    Merci d'avance

  2. #2
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Pas le moindre problème !
    S'il agit de créer des clés étrangères, la syntaxe va dépendre de ton SGBD. S'il s'agit de requête, tu peux faire une jointure comme celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT A.n_equipe AS EquipeA, B.n_equipe AS EquipeB
    FROM MATCH
    JOIN EQUIPE A
    ON A.n_equipe = MATCH.n_equipe
    JOIN EQUIPE B
    ON B.n_equipe = MATCH.n_equipe
    Roland

  3. #3
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 80
    Points
    80
    Par défaut
    Merci de ta réponse.
    A et B représente quoi exactement ? des tables ?

    Pour info, j'utilise Access 2003

  4. #4
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Ce sont des alias de tables. (On peut aussi écrire EQUIPE AS A)
    Dès qu'il y a plusieurs tables dans ta requête, tu risques d'avoir des ambiguités sur les noms de champs, et il est donc vivement conseillé de les préfixer par le nom de la table dont ils sont tirés. Les alias permettent dans ce cas de raccourcir l'écriture :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT T.MonChamp
    FROM MatableAuNomARallonge T
    au lieu de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT MatableAuNomARallonge .MonChamp
    FROM MatableAuNomARallonge
    Dans le cas où une table apparaît deux fois, les alias deviennent indispensables : dans ton cas, cela permet à la requête de distinguer le nom de l'équipe A, tiré de la table EQUIPE où on a fait la jointure sur n_equipe_a, du nom de l'équipe B, tiré de la table EQUIPE où on a fait la jointure sur n_equipe_b
    Roland

  5. #5
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 80
    Points
    80
    Par défaut
    Ah d'accord, merci.

    Et pour faire une requête qui afficherai :
    n_match | n_equipeA | nom_equipeA | n_equipeB | nom_equipeB

    Comment faut-il que je m'y prenne ? Il faudrait concaténer ces 2 requêtes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT MATCH.n_match, MATCH.n_equipeA, EQUIPE.nom_equipe
    FROM MATCH, EQUIPE
    WHERE MATCH.n_equipeA = EQUIPE.n_equipe
     
    SELECT MATCH.n_match, MATCH.n_equipeB, EQUIPE.nom_equipe
    FROM MATCH, EQUIPE
    WHERE MATCH.n_equipeB = EQUIPE.n_equipe

  6. #6
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Mais non, à partir de la précédente requête, tu prends tout simplement les champs dans la table MATCH :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT MATCH.n_match,
    MATCH.n_equipe_a, A.nom_equipe AS EquipeA, 
    MATCH.n_equipe_b, B.nom_equipe AS EquipeB
    FROM MATCH
    JOIN EQUIPE A
    ON A.n_equipe = MATCH.n_equipe
    JOIN EQUIPE B
    ON B.n_equipe = MATCH.n_equipe
    Je remarque que j'avais fait une erreur dans ta précédente requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT A.nom_equipe AS EquipeA, B.nom_equipe AS EquipeB
    FROM MATCH
    JOIN EQUIPE A
    ON A.n_equipe = MATCH.n_equipe
    JOIN EQUIPE B
    ON B.n_equipe = MATCH.n_equipe
    Dis, je me trompe, ou tu débutes ? Si c'est le cas, va faire un tour dans Cours SQL (ci-dessus ), et plonge-toi par exemple dans "SQL de A à Z". Ca aide bien !
    Roland

  7. #7
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 80
    Points
    80
    Par défaut
    Ok, merci.
    Tout dépends ce que tu entends par débuter, j'ai eu pas mal de cours à l'IUT et maintenant que je suis en stage et que je pratique c'est une autre affaire.. Donc j'ai un peu du mal, oui, mais sinon j'ai les bases.

    Plus je fais, plus j'apprends donc c'est cool

    Encore merci et bonne journée !

  8. #8
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Eh oui, en cours, on plane un peu dans la stratosphère, en stage on atterrit
    Roland

  9. #9
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 80
    Points
    80
    Par défaut
    En stage, c'est plus concret. De plus, les tâches à entreprendre sont beaucoup plus complexes à mon goût..

  10. #10
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 848
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 848
    Points : 52 964
    Points
    52 964
    Billets dans le blog
    6
    Par défaut
    PS : évitez d'utiliser MATCH comme nom de table. C'est un mot clef de SQL. Cela peut vous réserver quelques ennuis difficile à rectifier par la suite.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  11. #11
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 80
    Points
    80
    Par défaut
    Ok, merci je vais rectifier cela.

  12. #12
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 80
    Points
    80
    Par défaut
    Je viens de tester le code que tu m'as donné au bureau et ça ne marche pas..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT F_MATCH.n_match,
    F_MATCH.n_equipe_a, A.nom_equipe AS EquipeA, 
    F_MATCH.n_equipe_b, B.nom_equipe AS EquipeB
    FROM F_MATCH
    JOIN EQUIPE A
    ON A.n_equipe = F_MATCH.n_equipe
    JOIN EQUIPE B
    ON B.n_equipe = F_MATCH.n_equipe
    Ça me dis que j'ai une erreur de syntaxe dans la clause FROM. Apparemment ça serait lié au JOIN.
    (J'utilise Access, mais je tape mais requête en SQL)

  13. #13
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Exact, Access exige qu'on écrive INNER JOIN pour les jointures internes.

    Donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT F_MATCH.n_match,
    F_MATCH.n_equipe_a, A.nom_equipe AS EquipeA, 
    F_MATCH.n_equipe_b, B.nom_equipe AS EquipeB
    FROM F_MATCH
    INNER JOIN EQUIPE A
    ON A.n_equipe = F_MATCH.n_equipe
    INNER JOIN EQUIPE B
    ON B.n_equipe = F_MATCH.n_equipe
    Roland

  14. #14
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 80
    Points
    80
    Par défaut
    Oui merci, mais en fait il faut aussi rajouter des conditions après les INNER JOIN, non ??

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INNER JOIN EQUIPE AS B 
    ON B.n_equipe=F_MATCH.n_equipe
    WHERE B.nom_equipe='test'
    Le problème c'est que je ne peux pas mettre une condition pour les deux, enfin j'en ai pas l'utilité, sinon il faudrait que je mette une condition qui ne serve à rien

    Edit: En fait, quand je met qu'une jointure avec la condition, ça marche impécable, mais dès que je rajoute la deuxième et sa condition ça ne marche plus..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ....
    INNER JOIN EQUIPE AS A 
    ON A.n_equipe=F_MATCH.n_equipe
    WHERE A.nom_equipe='test'
    INNER JOIN EQUIPE AS B 
    ON B.n_equipe=F_MATCH.n_equipe
    WHERE B.nom_equipe='test2'
    Ca me dit que j'ai une erreur de syntaxe (opérateur absent)

  15. #15
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Non. Dans le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FROM F_MATCH, EQUIPE
    WHERE F_MATCH.n_equipeB = EQUIPE.n_equipe
    le WHERE est une fausse condition, qui exprime seulement la jointure entre les deux tables.

    Il est remplacé par le ON du JOIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INNER JOIN EQUIPE B
    ON B.n_equipe = F_MATCH.n_equipe
    Les 2 écritures sont équivalentes. Pour ma part, je préfère la 2ème, qui me paraît plus claire, surtout quand le nombre de tables augmente, et qui permet un passage "en douceur" aux jointures externes en remplaçant simplement INNER par LEFT ou RIGHT
    Roland

  16. #16
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 80
    Points
    80
    Par défaut
    J'ai fait comme tu as dis et ça me met :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    erreur de syntaxe (opérateur absent) dans l'expression 'A.n_equipe=F_MATCH.n_equipeA
    INNER JOIN EQUIPE AS B 
    ON B.n_equipe=F_MATCH.n_equipeB'

  17. #17
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 80
    Points
    80
    Par défaut
    Je viens de trouver une solution qui marche

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT F_MATCH.n_match,
    F_MATCH.n_equipe_a, A.nom_equipe AS EquipeA, 
    F_MATCH.n_equipe_b, B.nom_equipe AS EquipeB
    FROM (F_MATCH INNER JOIN EQUIPE A ON A.n_equipe = F_MATCH.n_equipeA)
    INNER JOIN EQUIPE B
    ON B.n_equipe = F_MATCH.n_equipeB
    En mettant les parenthèses ça marche nikel

  18. #18
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Excuse-moi, je n'avais apparemment pas lu ton précédent message jusqu'au bout Tes conditions (qui là sont bien des conditions) doivent toutes se trouver après les JOIN (qui font partie de la clause FROM)

    Pour le reste, c'est vrai qu'en cas de jointures multiples, Access exige qu'elles soient imbriquées

    Essaie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT F_MATCH.n_match,
    F_MATCH.n_equipe_a, A.nom_equipe AS EquipeA, 
    F_MATCH.n_equipe_b, B.nom_equipe AS EquipeB
    FROM (F_MATCH
             INNER JOIN EQUIPE A
             ON A.n_equipe = F_MATCH.n_equipe) T
    INNER JOIN EQUIPE B
    ON B.n_equipe = T.n_equipe
    sinon il faudra revenir aux jointures "malpropres" avec les WHERE, merci Microsoft

    PS : Nos messages se sont croisés !
    Roland

  19. #19
    Membre régulier
    Inscrit en
    Décembre 2005
    Messages
    134
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 134
    Points : 80
    Points
    80
    Par défaut
    Ben ce que tu me proposes c'est bien ce que j'ai testé et ça marche donc c'est super

    Merci beaucoup pour ton aide !

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

Discussions similaires

  1. [1.0.2][Zend_db_table] Gérer les liaisons entre les tables
    Par Baptiste Wicht dans le forum Zend_Db
    Réponses: 8
    Dernier message: 05/10/2007, 09h00
  2. Réponses: 5
    Dernier message: 25/04/2007, 11h34
  3. [cr 9] Problème sur un état, groupement et liaisons entre les tables
    Par Maltus dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 15/09/2006, 09h45
  4. Liaisons entre les tables.
    Par ox@na dans le forum Requêtes
    Réponses: 3
    Dernier message: 01/08/2006, 18h38
  5. liaison entre les tables
    Par celticval dans le forum Access
    Réponses: 19
    Dernier message: 05/04/2006, 16h49

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