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 entre 3 tables


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 6
    Points : 5
    Points
    5
    Par défaut [Résolu] Jointure entre 3 tables
    Bonjour,

    je possède un problème avec une requête que je réalise sur ma base sous Access. Celle-ci doit se faire sur les 3 tables suivantes :

    - Personnes(Nom, Prénom, Initiales,...) la clé est Initiales
    - Ordinateurs(Marque, Modèle, Nom Réseau, ...) la clé est "Nom Réseau"
    - Utilisateurs(Personne, Ordinateur) qui dit quel personne utilise quel ordinateur.
    Le champ "Personne" correspond à des "Initiales" dans la table "Personne" et le champ "Ordinateur"
    correspond à un "Nom Réseau" dans la table "Ordinateurs".

    Dans ma base, il y a des personnes qui n'utilisent pas d'ordinateurs et certaines personnes qui utilisent le même ordinateur.

    Mon problème est que je veux afficher toutes les personnes et avoir aussi toutes les caractéristiques
    de l'ordinateur qu'elles utilisent.

    J'ai réussi à afficher toutes les personnes avec le nom de l'ordinateur utilisé avec une jointure de ce type :

    SELECT [Personnes].[Monsieur/Mme], [Personnes].[Nom], [Personnes].[Prénom], [Personnes].[Initiales], [Personnes].[Secteur], [Personnes].[E-Mail], [Personnes].[Téléphone], [Personnes].[Bureau], [Personnes].[Pass Mail], [Personnes].[Pass], [Utilisateurs].[Personne], [Utilisateurs].[Ordinateur]
    FROM Personnes LEFT JOIN Utilisateurs ON [Personnes].[Initiales] =[Utilisateurs].[Personne];
    Je peux également afficher tous les utilisateurs avec toutes les caractéristiques de l'ordinateur qu'elles utilisent avec cette requête :

    SELECT [Utilisateurs].[Personne], [Utilisateurs].[Ordinateur], [Ordinateurs].[Marque], [Ordinateurs].[Modèle], [Ordinateurs].[S/N], [Ordinateurs].[Type], [Ordinateurs].[Marque Ecran], [Ordinateurs].[Modèle Ecran], [Ordinateurs].[S/N Ecran], [Ordinateurs].[CPU], [Ordinateurs].[RAM], [Ordinateurs].[VGA], [Ordinateurs].[HD], [Ordinateurs].[CD/DVD], [Ordinateurs].[Divers], [Ordinateurs].[Nom Réseau], [Ordinateurs].[Adresse MAC], [Ordinateurs].[Date Achat], [Ordinateurs].[Copie Facture]
    FROM Utilisateurs RIGHT JOIN Ordinateurs ON [Ordinateurs].[Nom Réseau] =[Utilisateurs].[Ordinateur];

    Mais si je désire avoir tout en même temps, je n'arrive jamais à avoir toutes les personnes avec tous les ordinateurs correspondants.

    Je ne sais pas comment je dois faire ma jointure dans la requête...

    Si quelqu'un pouvait m'aider, il serait le bienvenu !

    Merci d'avance.

    N.B. Pour infos j'ai 90 personnes pour 65 utilateurs d'ordinateurs pour 62 ordinateurs différents.[/b]

  2. #2
    Membre habitué

    Inscrit en
    Octobre 2002
    Messages
    139
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 139
    Points : 177
    Points
    177
    Par défaut
    Salut,

    je dirais à froid qq chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT P.*, O.* 
    FROM Utilisateurs RIGHT JOIN Personnes P ON U.Peronnes=P.Initiales
    RIGHT JOIN Ordinateurs O ON O.[Nom Réseau] =U.Ordinateur 
    GROUP BY O.[Nom réseau]
    Avec un regroupement sur le nom de l'ordinateur pour un affichage plus clair.

    krest.
    PS . j'ai mis des étoiles pour simplifier

  3. #3
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 54
    Points : 65
    Points
    65
    Par défaut
    Et comme par miracle les Personnes sans Ordinateurs sont aux abonnés absents.
    Le LEFT JOIN est généralement plus simple à apréhender, les tables étant référencées dans l'ordre de "priorité"

    GROUP BY ????????????????????????????????????????????

    ORDER BY

    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
     
    SELECT 
                P.*, O.* 
    FROM 
                Personnes P 
            LEFT JOIN             
                Utilisateurs U 
            ON 
                U.Personnes=P.Initiales
            LEFT JOIN 
                Ordinateurs O 
            ON 
                O.[Nom Réseau] =U.Ordinateur 
    ORDER BY 
             P.initiales

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Tout d'abord merci à vous deux de vous pencher sur mon problème, mais aucun des deux ne fonctionne... Je ne sais pas si c'est ce crétin de MS Access qui ne comprend rien mais il me met qu'il y a des erreurs de syntaxes...

    Pour la solution de krest :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT P.*, O.* 
    FROM Utilisateurs RIGHT JOIN Personnes P ON U.Peronnes=P.Initiales 
    RIGHT JOIN Ordinateurs O ON O.[Nom Réseau] =U.Ordinateur 
    GROUP BY O.[Nom réseau]
    l'erreur est la suivante :

    Erreur de syntaxe (opérateur absent) dans l'expression 'U.Personne=P.Initiales RIGHT JOIN Ordinateurs O ON O.[Nom Réseau]=U.Ordinateur'
    Pour la solution de Papounet :
    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
     
    SELECT 
                P.*, O.* 
    FROM 
                Personnes P 
            LEFT JOIN              
                Utilisateurs U 
            ON 
                U.Personnes=P.Initiales 
            LEFT JOIN 
                Ordinateurs O 
            ON 
                O.[Nom Réseau] =U.Ordinateur 
    ORDER BY 
             P.initiales
    L'erreur est celle-ci :

    Erreur de syntaxe (opérateur absent) dans l'expression 'U.Personne = P.Initiales LEFT JOIN
    Ordinateurs =
    ON
    O.[Nom Réseau]=U.Ordinateur'
    Bref, j'ai l'impression que Access ne comprend rien au SQL. Enfin je suis pas certain, mais il me semble que vos requêtes sont bien construites grammaticalement parlant...

    I need more help !

  5. #5
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    je te propose ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT P.*, O.* 
    FROM (Personnes P  LEFT JOIN    Utilisateurs U 
    ON   U.Personnes=P.Initiales) 
    LEFT JOIN Ordinateurs O 
    ON   O.[Nom Réseau] =U.Ordinateur 
    Union
    SELECT P.*, O.* 
    FROM (Ordinateurs O   LEFT JOIN    Utilisateurs U 
    ON   O.[Nom Réseau]=U.Ordinateur) 
    LEFT JOIN Personnes P
    ON  U.Personnes=P.Initiales
    A+

  6. #6
    Membre du Club
    Inscrit en
    Avril 2004
    Messages
    54
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 54
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par zigune
    Pour la solution de Papounet :

    L'erreur est celle-ci :

    Erreur de syntaxe (opérateur absent) dans l'expression 'U.Personne = P.Initiales LEFT JOIN
    Ordinateurs =
    ON
    O.[Nom Réseau]=U.Ordinateur'
    Remplace O.[Nom Réseau]=U.Ordinateur
    par O.Nom_Reseau =U.Ordinateur

    Si Nom_Reseau est bien le nom de la colonne de la table Ordinateurs

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Mammar merci, c'est ok. Ca en a tout l'air en tout cas !

    Je te remercie beaucoup.

    Papounet, non, c'était bien 'Nom réseau', mais ça ne joue pas.

    Bonne fin de journée les jeunes et encore merci pour votre grande aide.

  8. #8
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    Mammar merci, c'est ok. Ca en a tout l'air en tout cas !
    Si c'est le cas un tag [Résolu] serait le bienvenu


    A+

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2004
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Oui, je vais le faire de suite, mais je te pose quand même une question, parce que j'aime pas recopier des trucs bêtement sans rien comprendre...

    Qus sont exactement les deux parties de cette union ? Est-ce vraiment nécessaire ? Parce que si je fais une requête avec seulement la partie gauche de l'union il me semble que ça sort le même résultat, donc toutes les personnes avec l'ordinateur leur correspondant.

    Pour ce qui est de la partie droite, il y a seulement les utilisateurs d'ordinateurs qui sortent.

    J'ai un peu de peine à comprendre les jointures, mais je me demande si l'union est belle et bien nécessaire. (Oui, peut-être que pour la configuration actuelle de ma base ça ne change rien et que pour une autre configuration c'est mieux...)

    Bref, si tu pouvais encore m'éclairer sur ce point...

    Merci encore.

  10. #10
    Membre actif
    Inscrit en
    Février 2003
    Messages
    182
    Détails du profil
    Informations forums :
    Inscription : Février 2003
    Messages : 182
    Points : 206
    Points
    206
    Par défaut
    si je fais une requête avec seulement la partie gauche de l'union il me semble que ça sort le même résultat
    Oui si on part du fait q'un utilisateur à toujours un ordinateur qui lui soit alloué.
    sinon la partie gauche seulement ne te donnera pas les autres ordinateurs qui n'ont pas d'utilisateurs.

    A+

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

Discussions similaires

  1. Problème de jointure entre 3 tables
    Par Yphon dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/09/2005, 15h58
  2. PROBLEME DE JOINTURE ENTRE DEUX TABLE
    Par DarkMax dans le forum Langage SQL
    Réponses: 13
    Dernier message: 13/01/2005, 15h11
  3. Jointure entre deux tables et résultat
    Par Asdorve dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2004, 14h50
  4. [jointure]requete possible de double jointure entre 2 tables
    Par akira_le_gaucher dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/05/2004, 15h03
  5. Jointure entre 2 tables et OR
    Par PyRoFlo dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/02/2004, 18h42

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