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 :

Jointures entre plusieurs tables


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 60
    Points : 41
    Points
    41
    Par défaut Jointures entre plusieurs tables
    Bonjour à tous,

    Débutant en langage SQL, je coince sur un sujet qui me parait simple. Peut être pourrez-vous m'aider !

    Je dispose de 4 tables,
    1 principale dans laquelle quasiment toutes mes informations sont contenues : CAMPLABO,
    3 secondaires liées par P_IDCAMPLABO dans laquelle je veux aller chercher d'autres informations : CAMPLABOBALLE, CAMPLABOCORDAGE, CAMPLABORAQ
    1 table PROJET lié à ma principale par un identifiant.

    J'ai donc construit la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select distinct cmp.P_IDCAMPLABO,cmp.NOM,cmpprojet.CODE,cmp.ETAT, cmp.DTDEMANDE, cmp.DTSOUHAIT, cmp.DTCLOTURE
    from CAMPLABO cmp
    left join CAMPLABOBALLE cmpballe on cmpballe.P_IDCAMPLABO=cmp.P_IDCAMPLABO
    left join CAMPLABORAQ cmpraq on cmpraq.P_IDCAMPLABO=cmp.P_IDCAMPLABO
    left join CAMPLABOCORDAGE cmpcord on cmpcord.P_IDCAMPLABO=cmp.P_IDCAMPLABO
    left join PROJET cmpprojet on cmpprojet.P_IDPROJET=cmp.F_IDPROJET
    order by cmp.P_IDCAMPLABO desc
    Je coince pour aller chercher un dernier champ, il s'agit d'un champ CDSPORT qui est présent dans les tables secondaires CAMPLABOBALLE, CAMPLABOCORDAGE et CAMPLABORAQ.

    Est-il possible de rajouter un champ résultat dans la requête, qui en fonction de la campagne CAMPLABO, va chercher le champ CDSPORT de la table CAMPLABOBALLE ou CAMPLABOCORDAGE ou CAMPLABORAQ ?

    Merci pour votre aide,
    Sylvain

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,


    Pourquoi faites-vous une jointure sur la table projet sachant que vous n'utilisez aucune colonne de cette table dans la clause SELECT ?


    Pour votre problème regardez du côté du CASE WHEN.


    Sinon d'un point de vue générale, les tables CAMPLABO[BALLE] sont des tables filles de la table CAMPLABO ?

    edit: la solution de AL1_24 est mieux

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    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 115
    Points : 28 480
    Points
    28 480
    Par défaut
    COALESCE semble tout à fait adapté à cet usage...
    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
    17
    18
    19
    20
    21
    22
    23
    SELECT DISTINCT 
            cmp.P_IDCAMPLABO
        ,   cmp.NOM
        ,   cmpprojet.CODE
        ,   cmp.ETAT
        ,   cmp.DTDEMANDE
        ,   cmp.DTSOUHAIT
        ,   cmp.DTCLOTURE
        ,   COALESCE(cmpballe.CDSPORT, cmpraq.CDSPORT, cmpcord.CDSPORT) AS CDSPORT
    FROM    CAMPLABO cmp
        LEFT JOIN
            CAMPLABOBALLE cmpballe 
            ON  cmpballe.P_IDCAMPLABO = cmp.P_IDCAMPLABO
        LEFT JOIN
            CAMPLABORAQ cmpraq 
            ON  cmpraq.P_IDCAMPLABO = cmp.P_IDCAMPLABO
        LEFT JOIN
            CAMPLABOCORDAGE cmpcord
            ON  cmpcord.P_IDCAMPLABO = cmp.P_IDCAMPLABO
        LEFT JOIN
            PROJET cmpprojet
            ON  cmpprojet.P_IDPROJET = cmp.F_IDPROJET
    ORDER BY cmp.P_IDCAMPLABO DESC

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 60
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    Citation Envoyé par punkoff Voir le message
    Pourquoi faites-vous une jointure sur la table projet sachant que vous n'utilisez aucune colonne de cette table dans la clause SELECT ?
    parce que je ne maitrise pas complètement le requête

    Quant aux tables filles, je ne maitrise à nouveau pas cette notion.

    Sylvain

  5. #5
    Expert éminent sénior
    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
    Quant aux tables filles, je ne maitrise à nouveau pas cette notion.
    Je me posais la même question que Punkoff. Les tables CAMPLABOBALLE, CAMPLABOCORDAGE, CAMPLABORAQ sont-elles des spécialisations, c'est à dire des types particuliers de CAMPLABO, comme pourraient l'être les notions de "voiture", "camion" et "moto" par rapport à la notion plus générale "véhicule" ?

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 60
    Points : 41
    Points
    41
    Par défaut
    al1_24, ta solution fonctionne très bien, merci !
    punkoff, Cinephil, je pense que vous avez raison, les tables CAMPLABOxxxx doivent être des tables filles de la table CAMPLABO.

    Merci pour votre aide
    Sylvain

  7. #7
    Expert éminent sénior
    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
    Si ce sont des tables filles, la colonne CDSPORT se trouvant dans toutes ces tables filles devrait se trouver dans la table mère CAMPLABO.
    Ta requête serait ainsi beaucoup plus simple !

    À lire : Modélisation d'un héritage de données.

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

Discussions similaires

  1. Réponses: 16
    Dernier message: 20/05/2015, 14h36
  2. Jointure entre plusieurs tables
    Par cell dans le forum Pentaho
    Réponses: 7
    Dernier message: 25/03/2010, 13h30
  3. Jointure entre plusieurs tables
    Par Le gris dans le forum Requêtes
    Réponses: 8
    Dernier message: 23/03/2010, 10h38
  4. Réponses: 2
    Dernier message: 23/10/2009, 16h02
  5. Problème de Jointure entre plusieurs tables
    Par Stouille89 dans le forum JDBC
    Réponses: 12
    Dernier message: 11/12/2007, 15h16

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