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

ASP.NET Discussion :

Jointure et tri sur 4 tables


Sujet :

ASP.NET

  1. #1
    Membre habitué Avatar de Aquellito
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    337
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 337
    Points : 150
    Points
    150
    Par défaut Jointure et tri sur 4 tables
    Bonjour à tous,

    Ma problèmatique est la suivante :
    J'ai pour mon trombinoscope 4 tables :

    Collaborateur
    id | nom
    ++++++++++++++
    1 | pierre
    ++++++++++++++
    2 | paul
    ++++++++++++++
    3 | jacques

    Fonction
    id | nom_fonction
    +++++++++++++++++
    1 | technicien
    +++++++++++++++++
    2 | responsable
    +++++++++++++++++
    3 | chef agence

    Agence
    id | nom_agence
    +++++++++++++++++
    1 | agence nord
    +++++++++++++++++
    2 | agence est
    +++++++++++++++++
    3 | agence sud

    Collaboration
    id | id_collaborateur | id_fonction | id_agence
    +++++++++++++++++++++++++++++++++++++++++++++++
    1 | 1 | 1 | 1
    +++++++++++++++++++++++++++++++++++++++++++++++
    2 | 1 | 2 | 1
    +++++++++++++++++++++++++++++++++++++++++++++++
    3 | 1 | 2 | 2

    La table collaboration est en gros ma table de jointures. L'exemple ci-dessus montre que Pierre est technicien dans l'agence nord, et est responsable dans deux agences : l'agence nord et l'agence est.

    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
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    var RS_collaborateur = Server.CreateObject("ADODB.RecordSet");
    var RS_collaboration = Server.CreateObject("ADODB.RecordSet");
    var RS_fonction = Server.CreateObject("ADODB.RecordSet");
    var RS_agence = Server.CreateObject("ADODB.RecordSet");
     
    var req = "SELECT nom FROM collaborateur";
    RS_collaborateur.Open(req,conn,3,1);
     
    while (!RS_collaborateur.EOF)
    {
    	Response.Write("<strong>"+RS_collaborateur("nom")+" :</strong><br />");
     
    	req = "SELECT * FROM collaboration WHERE (id_collaborateur='"+RS_collaborateur("id")+"')";
    	RS_collaboration.Open(req,conn,3,1);
     
    	while (!RS_collaboration.EOF)
    	{
    		req = "SELECT nom_fonction FROM fonction WHERE (id='"+RS_collaboration("id_fonction")+"')";
    		RS_fonction.Open(req,conn,3,1);
    		Response.Write(RS_fonction("nom_fonction")+"&nbsp;-&gt;&nbsp;");
    		RS_fonction.Close;
     
    		req = "SELECT nom_agence FROM agence WHERE (id='"+RS_collaboration("id_agence")+"')";
    		RS_agence.Open(req,conn,3,1);
    		Response.Write(RS_agence("nom_agence")+"<br />");
    		RS_agence.Close;
     
    		RS_collaboration.MoveNext;
    	}
    	RS_collaboration.Close;
            RS_collaborateur.MoveNext;
            Response.Write("<br /><br />");
    }
    RS_collaborateur.Close;
    }
    Affichage :

    Pierre :
    Technicien -> Agence nord
    Responsable -> Agence nord
    Responsable -> Agence est
    Pour commencer, est-ce que ma méthode d'autodidacte vous parrait correct où vous pensez que c'est trop lourd à afficher. Est- ce que ça serait pas mieux avec une jointure externe ?

    Merci pour celui qui voudra bien se pencher sur mon problème de néophite

  2. #2
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut,

    il faut que tu regardes au niveau des jointures (pas besoin de faire des jointures externes)

    après tu ne dis pas sous quel forme tu veux le résultat.. mais en gros cela ferait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select ...
    from collaboration c
    join collaborateur co on c.id_collaborateur =co.id
    join...
    ...
    order by ...

  3. #3
    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 : 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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    On est dans le forum Langage SQL donc on va se concentrer la dessus.
    Pour ce qui est du langage (lequel d'ailleurs ?), voir dans le forum approprié.

    D'abord un peu de conception quand même...
    Si Collaboration est une table de jointure, inutile de lui donner une colonne identifiant. La clé primaire de cette table est normalement composée des clés primaires des 3 autres tables. Laisser l'identifiant laisse la possibilité de créer deux fois le même triplet (collaborateur, fonction, agence), ce qui est redondant et donc mauvais.

    La requête ci-dessous devrait vous afficher le nom du collaborateur, le libellé de sa fonction et le nom de l'agence, le tout trié par le nom du collaborateur, agence, fonction mais c'est facile à adapter pour trier autrement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT c.nom, f.nom_fonction, a.nom_agence
    FROM Collaboration co
    INNER JOIN Collaborateur c ON co.id_collaborateur = c.id
    INNER JOIN Fonction f ON co.id_fonction = f.id
    INNER JOIN Agence a ON co.id_agence = a.id
    ORDER BY c.nom, a.nom_agence, f.nom_fonction

  4. #4
    Membre habitué Avatar de Aquellito
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    337
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 337
    Points : 150
    Points
    150
    Par défaut
    Oui c vrai que le langage web (ASP JScript pour être précis) n'a rien à faire ici mais c'était pour illustrer la méthode de substitution en SQL que je voulais obtenir et que je ne trouvais pas. Merci pour ta requête qui me semble impec et surtout m'aide à bien comprendre ce système de jointure que je ne comprenais pas trop.

    Par contre (je dis ça sans avoir tester car je ne suis pas au boulot là), ta requête devrait afficher le résultat sous cette forme si je ne me trompe :

    Pierre :
    Responsable -> Agence est

    Pierre :
    Responsable -> Agence nord

    Pierre :
    Technicien -> Agence nord
    alors que le résultat souhaité serait plutôt :

    Pierre :
    Responsable -> Agence est
    Responsable -> Agence nord
    Technicien -> Agence nord
    Mais bon c'est vrai que je suis en train de me rendre compte que le classement par fonction dans ce cas serait peut-être impossible car comment classer par fonction sans avoir de doublon du nom du collaborateur sachant que celui-ci a plusieurs fonctions. Je sais pas si je suis très clair là héhé.

    Bref je patauge dans le concept même de ce trombinoscope.
    En tout cas merci aussi pour le conseil sur l'identifiant de ma table de jointure, encore une erreur de débutant

  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 : 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 799
    Points : 34 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Aquellito Voir le message
    Par contre (je dis ça sans avoir tester car je ne suis pas au boulot là), ta requête devrait afficher le résultat sous cette forme si je ne me trompe :

    Pierre :
    Responsable -> Agence est

    Pierre :
    Responsable -> Agence nord

    Pierre :
    Technicien -> Agence nord
    Non, le SGBD donnera les lignes :
    Pierre / Responsable / Agence est
    Pierre / Responsable / Agence nord
    Pierre / Technicien / Agence nord


    alors que le résultat souhaité serait plutôt :
    Pierre :
    Responsable -> Agence est
    Responsable -> Agence nord
    Technicien -> Agence nord
    La mise en forme des données, c'est le boulot du logiciel qui récupère les données, pas celui du SGBD.

  6. #6
    Membre habitué Avatar de Aquellito
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    337
    Détails du profil
    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 337
    Points : 150
    Points
    150
    Par défaut
    bon ok, je vais donc me diriger vers le forum ASP. Parce que je ne voie pas comment afficher ces fameuses lignes sans afficher plusieurs fois le nom.

    Non, le SGBD donnera les lignes :
    Pierre / Responsable / Agence est
    Pierre / Responsable / Agence nord
    Pierre / Technicien / Agence nord
    lol, tu joues un peu sur les mots là, j'ai écrit exactement la même chose avec un saut de ligne en plus

    En tout cas merci pour votre aide.

    Bonne continuation,
    Axel

Discussions similaires

  1. [WD 12] Problème de tri sur une table
    Par L.Lemarchand dans le forum WinDev
    Réponses: 7
    Dernier message: 26/06/2008, 00h00
  2. Réponses: 2
    Dernier message: 12/01/2008, 14h57
  3. Tri sur 2 tables
    Par VARACH dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/09/2006, 14h57
  4. Jointure et regroupement sur 2 tables
    Par rocs dans le forum Langage SQL
    Réponses: 1
    Dernier message: 26/07/2005, 11h04
  5. Réponses: 2
    Dernier message: 22/04/2005, 16h44

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