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 :

Table avec 2 clés pointant sur le même table


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 235
    Points : 183
    Points
    183
    Par défaut Table avec 2 clés pointant sur le même table
    Bonjour,

    j'aurais une petite question SQL...

    J'ai 2 tables : Dossier et Individu

    Dans Dossier, j'ai entre autre 2 clés "index_individu" et "index_conjoint". Ces deux clés pointent en fait sur la même table "Individu" (puisque le conjoint est aussi un individu).
    Dans la table "Individu", j'ai le prénom, le nom, etc...

    Si dans une requête je souhaite avoir le nom et le prénom de l'individu "individu" et de l'individu "coinjoint" d'un dossier, comment je peux faire ?
    Je bloque...

    Merci d'avance !

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    un index n'a rien à voir avec une clef et il existe 3 types de clef : clef primaire, clef subrogée (ou alternative) et clef étrangère... Voulez vous êtres plus clair ?

    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/ * * * * *

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 235
    Points : 183
    Points
    183
    Par défaut
    Considérons que ce sont 2 clés étrangères.

    J'aurais une (grosse) modification à apporter, c'est qu'en fait, j'ai une table Conjoint et une table Individu séparées.

    Pour résumer :

    Table Dossier :
    num_dossier
    num_individu
    num_conjoint

    Table Individu :
    num_individu
    nom
    prenom

    Table conjoint :
    num_conjoint
    nom
    prenom

    Et le "num_conjoint" de la table Dossier n'est pas obligatoirement renseigné...

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Pour le besoin de votre premier post, vous avez tout à fait le droit d'utiliser plusieurs fois la même table dans une même requête.
    Il faut utiliser une jointure externe pour récupérer également les dossiers sans conjoint :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT D.num_dossier, I.nom, I.prenom, C.nom, C.prenom
      FROM Dossier D
           INNER JOIN Individu I
             ON I.num_individu = D.num_individu
           LEFT OUTER JOIN Individu C
             ON C.num_individu = D.num_conjoint
    Pour votre second besoin, même chose en utilisant la table conjoint.
    Mais au niveau modélisation, le premier modèle est meilleur.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 235
    Points : 183
    Points
    183
    Par défaut
    Ok Merci beaucoup.

    Le contexte de ma question est assez compliqué, en fait je test une suite de Business Intelligence : Pentaho. Et j'ai une base données avec une table Dossier et une table Individu.
    Avec un module de Pentaho on peut créer un couche par dessus la base de données : les métadonnées.
    Dans cette couche j'ai "doublé" la table Individu, une correspond à l'individu, l'autre au conjoint.
    Et dans ce module de Pentaho, lorsque je test des requêtes et que je lui demande tous les dossiers avec le nom et prenom de l'individu correspondant et du conjoint (lorsqu'il y en a un) il me génère automatiquement cette requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT dossier.num_dossier, individu.nom ,individu.prenom, conjoint.nom, conjoint.prenom 
    FROM dossier JOIN
    (individu JOIN
    (dossier LEFT OUTER JOIN conjoint ON conjoint.num_conjoint = dossier.num_conjoint)
    ON individu.num_individu = dossier.num_individu)
    Et cette requête est fausse. Il me dit un truc du style " Dossier, Table/Alias non unique". Ce qui me parait normal vu l'utilisation de la table Dossier dans la requête...

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    235
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 235
    Points : 183
    Points
    183
    Par défaut
    Ah si apparemment cette requête fonctionne...

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 135
    Points : 164
    Points
    164
    Par défaut
    essais ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT dossier.num_dossier, individu.nom ,individu.prenom, conjoint.nom, conjoint.prenom 
    FROM dossier JOIN individu 
    ON individu.num_individu = dossier.num_individu
    LEFT OUTER JOIN conjoint 
    ON conjoint.num_conjoint = dossier.num_conjoint

Discussions similaires

  1. Réponses: 6
    Dernier message: 09/11/2012, 23h18
  2. Réponses: 0
    Dernier message: 19/10/2012, 10h01
  3. Réponses: 8
    Dernier message: 10/07/2012, 19h57
  4. Création du scaffold avec double clef étrangère sur la même table
    Par BakaOnigiri dans le forum Ruby on Rails
    Réponses: 4
    Dernier message: 17/12/2009, 22h32
  5. 2 clés étrangères sur la même table et même attribut
    Par jinar dans le forum Langage SQL
    Réponses: 2
    Dernier message: 30/04/2009, 22h55

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