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 :

Une requête sur trois tables


Sujet :

Langage SQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 47
    Par défaut Une requête sur trois tables
    Bonjour les amis,

    J'ai troix tables. Collaborateurs, Titres et (ass_coll_tit) la table qui associe les deux. Un collaborateur ne peut avoir qu'un seul titre (Stagier, Consultant, Directeur etc.), mais au fil de temps son titre peut changer. Je suis obligé de gardé l'historique de changement de titre.

    Mon problème c'est que je dois pouvoir faire une requette qui me permettra de sélectionner les champs suivants.

    Nom Prenom Titre Actuel

    Voila les champs de mes tables.

    Collaborateur
    coll_no
    coll_nom
    coll_prenom

    ass_coll_tit
    ass_tit_no
    ass_coll_no
    ass_dat_deb
    ass_dat_fin

    Titre
    tit_no
    tit_designation

    Je vous remercie à l'avance de votre aide.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 138
    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 138
    Par défaut
    Pourriez-vous nous présenter une ébauche de la requête que vous tentez de mettre au point.
    Cela sera plus facile pour la faire évoluer.
    En précisant le SGBD que vous utilisez et sa version, les réponses proposées seront adaptées aux spécificités et limitations de celui-ci.
    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 émérite
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    500
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 500
    Par défaut
    Ca doit être à peu près ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Select C.coll_nom, C.coll_prenom, T.tit_designation
    from Collaborateur C, ass_coll_tit A, Titre T
    where C.coll_no = A.ass_coll_no
    and A.ass_tit_no = T.tit_no
    and date_courante >= A.ass_dat_deb
    and date_courante <= A.ass_dat_fin

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 065
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 065
    Par défaut
    Bonjour,

    En supposant qu'un titre actuel correspond à un champ ass_dat_deb renseigné et un champ ass_dat_fin non renseigné, ça peut donner la requête suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT c.coll_nom, c.coll_prenom, t.tit_designation
    from collaborateur c
    inner join ass_coll_tit a on c.coll_no = a.ass_coll_no
    inner join Titre t on a.ass_tit_no = t.tit_no
    where a.ass_dat_deb is not null
    and a.ass_dat_deb is null
    J'ai pas testé, c'est juste une idée de départ...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 47
    Par défaut
    Merci pour votre aide les amis,

    En fait le champs "ass_dat_deb" est toujours renseigné mais le champs "ass_dat_fin" peut être renseigné parfois et parfois elle peut être vide(depend de contrat signé avec le collaborateur "déterminé/indéterminé").

    J'utilise la base access.

    Merci pour m'aider.

  6. #6
    Membre chevronné Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Par défaut
    Tu ne mets pas de condition sur ass_dat_fin (car on s'en fout si elle est renseignée ou pas). Pour ce qui est de ass_dat_deb, normalement elle doit toujours être renseignée et <= à la date courante. Tu peux par précaution effectuer les tests
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    ass_dat_deb <> '' and ass_dat_deb <= now()
    Sinon pour les jointures, les deux solutions proposées plus haut sont ok.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 47
    Par défaut
    Je n'arrive toujours pas à faire cette requette, vu qu'un collaborateur peut avoir plusieurs titre (au différent moment). il me sort tous les titre. alors que je voudrais avoir son titre actuel.

    La ass_dat_fin peut être vide parfois et parfois peut être rensigné. Donc il faut que je regarde la ass_dat_deb et je prenne la plus grande ass_dat_deb pour chaque collaborateur.

    Aidez moi s'il vous plait.

    Merci

  8. #8
    Membre chevronné Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Par défaut
    Est-ce que la date ass_dat_deb représente la date de changement de titre (à chaque fois qu'un collaborateur change de titre, une nouvelle ass_dat_deb est saisie) ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 47
    Par défaut
    Oui exactement c'est ça.

    A chaque fois qu'un collaborateur change son titre un noueau date est saisi.

  10. #10
    Membre chevronné Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Par défaut
    As-tu essayé de faire ça :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select C.coll_nom, C.coll_prenom, T.tit_designation, max(A.ass_dat_deb)
    from Collaborateur C, ass_coll_tit A, Titre T
    where C.coll_no = A.ass_coll_no
    and A.ass_tit_no = T.tit_no
    group by C.coll_nom, C.coll_prenom, T.tit_designation;

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2007
    Messages : 47
    Par défaut
    No ça ne marche pas. ça me sorte plusieurs occurences de la même collaborateur. Avec chaque titre. Par exemple :

    Maxime Consultant

    Maxime Stagier

  12. #12
    Membre chevronné Avatar de AL1986
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 434
    Par défaut
    Et ça :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT C.coll_nom, C.coll_prenom, T.tit_designation
    FROM Collaborateur C, ass_coll_tit A, Titre T
    WHERE C.coll_no = A.ass_coll_no
    AND A.ass_tit_no = T.tit_no
    GROUP BY C.coll_nom, C.coll_prenom, T.tit_designation
    having A.ass_dat_deb = (select max(A1.ass_dat_deb)
                            from Collaborateur C1, ass_coll_tit A1
                            where C1.coll_no = A1.ass_coll_no
                            group by C1.coll_no);

Discussions similaires

  1. Aide pour une requête sur deux tables
    Par Andry dans le forum Développement
    Réponses: 2
    Dernier message: 05/11/2007, 08h14
  2. [SQL] Une requête sur 2 tables
    Par jf63000 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 19/10/2007, 13h50
  3. [Access] Fonction TOP dans une requête sur deux tables
    Par pc75 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/07/2007, 10h31
  4. [phpMyAdmin] Faire une requête avec trois tables
    Par camzo dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 04/12/2006, 23h55
  5. faire une requête sur plusieurs tables
    Par julien.63 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 16/08/2006, 23h58

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