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 :

Jointure de deux tables SQL


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 148
    Points : 62
    Points
    62
    Par défaut Jointure de deux tables SQL
    Bonjour
    J'ai un soucis avec la jointure de deux tables, je vous explique le problème
    au fait j'ai une table personne sa clé primaire est num_personne cette table a aussi une colonne num_adresse
    la deuxième table est adresses cette tables a deux colonnes(num_adresse et ordre adresse) qui construit une clé , et une troisième colonne nomRue
    donc quand je fais une jointure de ces deux table comme suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select p.nomRue
    from adresse a personne p
    where p.num_adresse=a.num_adresse
    ca me renvoie plusieurs nomRue car ces dérnier en le même num_adresse alors que je q'un seul
    bon exemple si dans ma table personne pour une personne x j'ai le num_adresse=12 si je cherche ce num dans la tables adresses je vois qu'il correspond à plusieurs rue alors que je veux récupérer qu'une seul rue


    j'espère que c'était clair

    Merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 099
    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 099
    Points : 28 400
    Points
    28 400
    Par défaut
    Pas vraiment clair.
    Purrais-tu nous un exemple de données ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 60
    Points : 81
    Points
    81
    Par défaut
    Citation Envoyé par javast Voir le message
    j'espère que c'était clair
    Pas particulièrement .

    Si je comprends bien ça fait la structure suivante :
    personne(num_personne, num_adresse)
    adresse(num_adresse, ordre_adresse, nomRue)

    Cela autorise effectivement plusieurs noms de rue pour une personne, mais chacun de ces nom de rue est associé à un ordre_adresse distinct.

    Il faut préciser à la base de données quelle rue tu veux, parmi toutes celles qui peuvent exister pour une personne.

    Tu peux préciser un ordre d'adresse :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select a.nomRue
    from adresse a, personne p
    where p.num_adresse=a.num_adresse and a.ordre_adresse = 1;
    C'est une bonne solution si tu connais l'odre_adresse à choisir (éventuellement suite à uen requête SQL précédente).

    Tu peux choisir une ligne au pif (mais dans ce cas, tu peux récupérer des résultats différents en faisant le select plusieurs fois), en syntaxe MySQL :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    select t.rue from
    (select a.nomRue rue
    from adresse a, personne p
    where p.num_adresse=a.num_adresse) t
    limit 1;

    Tu peux prendre le nom de rue avec le plus petit ordre d'adresse (pas propre d'utiliser le LIMIT 1 et l'ordre comme ça, mais bon) :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select t.rue from
    (select a.nomRue rue, a.ordre_adresse ordre
    from adresse a, personne p
    where p.num_adresse=a.num_adresse
    order by ordre asc) t
    limit 1;

    Le limit 1 est du MySQL, il existe des équivalents dans les autres SGBD. Sinon on peut aller chercher l'ordre avec une requête imbriquée, ou même une autre requête.
    Pour t'aider plus, il faudrait savoir avec quel SGBD tu travailles, et surtout sur quel critère tu veux choisir un nom de rue (donc savoir ce que signifie cet ordre d'adresse).

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    566
    Détails du profil
    Informations personnelles :
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2009
    Messages : 566
    Points : 1 045
    Points
    1 045
    Par défaut
    Bonjour,

    D'après des explications, tes tables ont le schéma défini par javast
    personne(num_personne, num_adresse)
    adresse(num_adresse, ordre_adresse, nomRue)
    Si le num_adresse n'est pas un numéro unique par personne (clé alternative), il me semble difficile de créer un requête qui réponde à ta demande. Le num_personne de la personne étant unique, il pourrait être inclus comme clé étrangère dans la table adresse. La nouvelle présentation

    personne(num_personne, num_adresse)
    adresse(num_adresse, ordre_adresse, nomRue, #num_personne)

    Il serait bien également d'actualiser ta présentation des jointures.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT a.nomRue
    FROM personne p  
       INNER JOIN adresse a ON a.num_adresse = a.num_adresse AND a.ordre_adresse = 1;
    Un bon mélange de toutes les explications doit te permettre de traiter ta difficulté.

    Bon courage

  5. #5
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Revenons à la première étape de la conception : les règles de gestion.
    Javast, demande-toi si :
    1) Une personne peut avoir plusieurs adresse et une adresse n'appartient qu'à une personne.

    ou bien :
    2) Une personne peut avoir plusieurs personnes et une adresse appartient de une à plusieurs personnes.

    2ème étape : le Modèle Conceptuel de Données (MCD, méthode Merise)
    MCD correspondant à la règle de gestion 1 :
    personne -0,n----avoir----1,1- adresse

    ou bien MCD correspondant à la règle de gestion 2 :
    personne -0,n----avoir----1,n- adresse

    3ème étape : les tables
    1)
    personne_prs (prs_id, prs_nom, prs_prenom...)
    adresse_adr (adr_id, adr_id_personne, adr_rue, adr_code_postal, adr_id_ville)

    ou bien 2)
    personne_prs (prs_id, prs_nom, prs_prenom...)
    adresse_adr (adr_id, adr_rue, adr_code_postal, adr_id_ville)
    prs_avoir_adr_paa (paa_id_adresse, paa_id_personne)

    Constat : aucune des deux solutions ne correspond à ton modèle !

    Conclusion : il faut revoir ta conception !

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 148
    Points : 62
    Points
    62
    Par défaut
    Merci à vous tous pour votre réponse, et désolé de ne pas pouvoir répondre avant car je n'avais pas de connexion chez moi ce week-end
    donc finalement j'ai fini par préciser l'ordre de mon adresse comme vous l'aviez dit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT a.nomRue
    FROM personne p  
       INNER JOIN adresse a ON a.num_adresse = a.num_adresse AND a.ordre_adresse = 1;

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

Discussions similaires

  1. Jointure entre un fichier Excel et deux tables SQL Server EN VB
    Par sql_bin dans le forum Général VBA
    Réponses: 1
    Dernier message: 10/11/2010, 15h57
  2. jointure de deux tables de deux bases de données!
    Par JauB dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 04/01/2006, 11h05
  3. [MySQL] Jointure entre deux tables
    Par Flushovsky dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 03/10/2005, 18h55
  4. PROBLEME DE JOINTURE ENTRE DEUX TABLE
    Par DarkMax dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/01/2005, 15h11
  5. Jointure entre deux tables et résultat
    Par Asdorve dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2004, 14h50

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