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 :

Référence à la même clé primaire pour deux valeurs différentes


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 74
    Par défaut Référence à la même clé primaire pour deux valeurs différentes
    Bonjour,

    J'ai trois tables : A, B et C :

    A B C
    Aid Bid
    Cid
    Anom Aid
    Aid

    (La table A contient entre autres Aid (clé primaire), Anom (nom) ; les tables B et C contiennent Aid en clé étrangère.)

    Le champ Anom associé à Aid de B et celui associé à Aid de C sont différents.
    Ma question est : comment dans une requête avoir accès à Anom de la table B et à Anom de la table C ?
    Déjà, dans le select, il faut écrire deux Anom, comment est-ce possible ?

    Exemple parlant d'enregistrement :

    A :
    Aid
    Anom
    1 Toto
    2 Pim
    3 Rox

    B :
    Bid
    Aid
    1 2
    2 1
    C :
    Cid
    Aid
    1 1
    2 3

    Je veux donc pouvoir afficher en résultat de ma requête le nom "Pim" associé à Bid=1 et le nom "Rox" associé à Cid=2 (car ces deux lignes sont en relation par un autre lien que je n'explicite pas ici).

    Des exemples de code seraient bienvenus...

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    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 136
    Par défaut
    Ce sont juste quelques jointures à mettre en oeuvre...
    Je te conseille de commencer par lire ce tutoriel : Les jointures, ou comment interroger plusieurs tables

    Reviens avec le code que tu auras testé et les problèmes que tu rencontres encore.
    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
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 74
    Par défaut
    Oui, merci. En fait, je sais ce qu'est une jointure "classique" et je sais faire des jointures, mais là il y a un petit truc un peu plus subtil il me semble.
    Si quelqu'un a une réponse un peu plus aidante que ça, je suis preneur parce que les réponses du genre : "c'est juste ça à faire" sans autre explication, ben...

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    La seule subtilité est que vous allez joindre deux fois la même table, si j'ai bien compris (la structure complète des tables aurait aidé à mieux comprendre, vous parlez juste vaguement d'un lien entre la table B et la table C...)

    Si vous joignez deux fois la même table, il faut alors leurs assigner des alias afin des les distinguer dans le reste de la requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT A1.Anom AS nomB, A2.Anom as nomC
    FROM B
    INNER JOIN A AS A1
        ON A1.id = B.Aid
    ... C
    INNER JOIN A AS A2
        ON A2.id = C.Aid

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 74
    Par défaut
    Merci pour cette réponse éclairante. Effectivement, la subtilité était peut-être "juste" là. Je vais y réfléchir demain et je poste mes résultats !

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 74
    Par défaut
    Désolé pour ce retour tardif, je n'ai pas pu revenir à ce sujet avant aujourd'hui.
    Alors il semblerait bien que ce soit effectivement "l'astuce" qui me manquait (donner deux noms différents à la même table), mais avec la jointure je ne sais pas comment l'écrire "proprement".

    Et au passage je me suis plongé dans la théorie des jointures parce que c'était un peu loin et jusqu'à présent, ce que je faisais ne nécessitait pas autre chose que quelque chose du genre

    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
     
    SELECT 
       A.A1, 
       B.B1, 
       ... 
    FROM 
       A, 
       B, 
       C, 
       ...
    WHERE
       A.Cid=C.Cid
       AND B.Did=D.Did
       AND ...
       AND A.A1 > 1000
       AND ...
    bref, un mélange des conditions de jointure avec les conditions de filtrage. Ce n'est pas très propre car pas très lisible et réclame beaucoup d'attention quand on a beaucoup de tables (comme c'est mon cas : j'en ai 8 à lier !). L'avantage c'est que c'est plus simple à écrire formellement : toutes les tables du FROM sont au même niveau.

    Maintenant que je suis retourné à l'école , j'aimerais écrire mon FROM avec des INNER JOIN et des ON. Le problème que je rencontre, c'est que je vois que formellement il y a au moins deux cas : soit les tables sont toutes liées à la première (autrement dit, tous les ON seront du genre "A.Aid= X.Aid"), soit les tables sont liées entre elles de diverses manières (autrement dit, il y aura des "ON A.Aid = B.Aid", puis des "ON B.Cid=C.Cid", puis des...).
    Le second cas est certainement le plus courant j'imagine, car intuitivement ça traduit une structure bien répartie avec des tables qui sont liées entre elles et non pas toutes à la même table. C'est bien sûr mon cas !

    J'ai vu qu'on mettait parfois des "(" ")" autour des INNER JOIN, d'autres fois non, mais je n'arrive pas à faire fonctionner ma requête sur mon cas pratique...

    D'où ma question : comme rédiger la requête FROM dans le cas par exemple de 4 tables A, B, C et D telles que

    A1.Aid=B.Aid,
    A2.Aid=C.Aid,
    B.Bid=D.Bid

    (où A1 et A2 sont des alias de A) ?

    Notamment, comment faire pour utiliser un alias de chaque table (parce qu'ici j'ai pris A, B, C mais en fait c'est plutôt Aaadvlkjsldf AS A, Blkjfdljsdf AS B, etc.) ?

    Merci de votre aide.

    PS : Si je pose la question, c'est que je n'ai pas trouvé la réponse dans les exemples que j'ai trouvés sur internet (cours ou forum). Si j'en ai loupé un intéressant sur le sujet, n'hésitez pas à me le dire .

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

Discussions similaires

  1. Même adresse IP pour deux DNS différents
    Par na.mike dans le forum Domaines
    Réponses: 3
    Dernier message: 20/01/2011, 08h47
  2. Réponses: 3
    Dernier message: 30/06/2008, 22h18
  3. Réponses: 4
    Dernier message: 20/11/2007, 16h13
  4. Réponses: 6
    Dernier message: 24/05/2007, 13h40
  5. Réponses: 3
    Dernier message: 24/07/2006, 16h11

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