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

Requêtes et SQL. Discussion :

Outer Join multiples sous Access 2003


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Inscrit en
    Mars 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Outer Join multiples sous Access 2003
    Bonjour,

    Je développe sous Access 2003 une application d'évaluation des connaissances des techniciens sur les équipements exploités. Ces techniciens sont associés à un site et une fonction de rattachement. Dans une partie d'analyse de l'outil, je souhaite générer une requête (utilisée en source d'un tableau croisé dynamique Excel) m'indiquant les techniciens par sites et par fonctions, en incluant les sites et les fonctions sans personnel rattaché. Je voudrais donc faire une requete qui peut se résumer ainsi :
    - Afficher les données sur les utilisateurs, les sites et les fonctions pour les utilisateurs rattachés à un site particulier et une fonction particulière
    et aussi afficher les données sur les sites et les fonctions sans personnel rattaché

    Un schéma pour bien poser la problématique

    Table_Site --- Table_Personnel --- Table_Fonction


    Table_Personnel
    N°_Personnel N°_Site N°_Fonction infos_personnel
    1 1 1 aaa
    2 1 2 bbb
    3 2 1 ccc


    Table_Site
    N°_Site infos_site
    1 ddd
    2 eee
    3 fff


    Table_Fonction
    N°_Fonction infos_fonction
    1 ggg
    2 hhh
    3 iii


    Résultat souhaité de la requête (utilisée en source du tableau croisé dynamique) :
    N°_Personnel infos_personnel infos_site infos_fonction
    1 aaa ddd ggg
    2 bbb ddd hhh
    3 ccc eee ggg
    Null Null fff Null
    Null Null Null iii

    J'ai essayé :
    - de combiner deux left join dans une seule requête : ça ne marche pas (expression de jointure non supportée)
    - de bidouiller une full outer join à partir de deux requetes liées par un "UNION", ces deux requêtes faisant elles-memes des left join entre site et personnel d'une part, fonction et personnel d'autre part, ça ne marche pas (erreur dans la clause FROM)

    Voilà, si quelqu'un a une idée, merci d'avance... Sinon, merci quand même d'avoir lu mon post

  2. #2
    Membre expérimenté
    Homme Profil pro
    Indépendant développeur et formateur
    Inscrit en
    Octobre 2007
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Indépendant développeur et formateur
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 036
    Points : 1 598
    Points
    1 598
    Par défaut
    hello
    pour la clarté, j'ai procédé endeux étapes:
    - trois petites requêtes simple
    - un requête union

    la première "fonction_vide"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Table_Personnel.N°_Personnel, Table_Personnel.infos_personnel, Table_Site.infos_site, Table_Fonction.infos_fonction
    FROM Table_Site RIGHT JOIN (Table_Fonction LEFT JOIN Table_Personnel ON Table_Fonction.N°_Fonction = Table_Personnel.N°_Fonction) ON Table_Site.N°_Site = Table_Personnel.N°_Site
    WHERE (((Table_Personnel.N°_Personnel) Is Null));
    elle donne
    Null Null Null iii

    la deuxième "site_vide"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Table_Personnel.N°_Personnel, Table_Personnel.infos_personnel, Table_Site.infos_site, Table_Fonction.infos_fonction
    FROM Table_Site LEFT JOIN (Table_Fonction RIGHT JOIN Table_Personnel ON Table_Fonction.N°_Fonction = Table_Personnel.N°_Fonction) ON Table_Site.N°_Site = Table_Personnel.N°_Site
    WHERE (((Table_Personnel.N°_Personnel) Is Null));

    elle est symétrique de la première avec les liasons dans l'autre sens et elle donne
    Null Null fff Null

    la troisième personnel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT Table_Personnel.N°_Personnel, Table_Personnel.infos_personnel, Table_Site.infos_site, Table_Fonction.infos_fonction
    FROM Table_Site INNER JOIN (Table_Fonction INNER JOIN Table_Personnel ON Table_Fonction.N°_Fonction = Table_Personnel.N°_Fonction) ON Table_Site.N°_Site = Table_Personnel.N°_Site;
    bien sûr, elle ressemble au deux autres mais les jointures sont simples et elle donne
    1 aaa ddd ggg
    2 bbb ddd hhh
    3 ccc eee ggg

    Enfin résultat_souhaité
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT fonction_vide.*
    FROM fonction_vide
     
    union
     
    SELECT site_vide.*
    FROM site_vide
     
    UNION SELECT personnel.*
    FROM personnel;
    ce qui donne:
    Null Null Null iii
    Null Null fff Null
    1 aaa ddd ggg
    2 bbb ddd hhh
    3 ccc eee ggg

    il est très simple pour un pro de rassembler tout ça en un seul SQL
    personnellement, je trouve qu'il est plus facile d'avir les trois premières requêtes accessibles par le générateur graphique de requêtes et un "SQL pur" le plus léger possible

    NB la requête "personnel" peut être accolée à "site_vide" en enlevant le where mais je garde quand même la structure à trois sous requêtes car je peux réutiliser chacune indépendament

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    je suis novice alors mon conseil vaut ce qu'il vaut !
    Mais sous access 2000, en cas de jointures externes multiples il faut faire attention à bien mettre les parenthèses sinon on a le message d'erreur
    "expression de jointure non supportée".

    exemple de syntaxe à suivre: (inutile de dire que le code n'est pas complet)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * FROM 
    ( MATABLE 
    LEFT JOIN ( FACTURE LEFT JOIN COMMANDE ON ... = ...) ON ... = ...) 
    LEFT JOIN ( CLIENT LEFT JOIN  FOURNISSEUR ON ... = ....) ON ... = ...
    WHERE ....
    Il faut ouvrir une parenthèse avant "MATABLE" et la refermer juste avant le dernier "ON" de jointure.

    Bon courage

  4. #4
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut à tous,
    attention doublon avec la discution ici

Discussions similaires

  1. Taille d'une zone de texte dans un état sous Access 2003
    Par Petite grenouille dans le forum Contribuez
    Réponses: 4
    Dernier message: 15/05/2006, 20h39
  2. Problème de table liées sous Access 2003
    Par FuRioX dans le forum Access
    Réponses: 2
    Dernier message: 05/04/2006, 13h19
  3. Clauses ALTER COLUMN multiples sous Access 2000
    Par richardkiii dans le forum Access
    Réponses: 10
    Dernier message: 30/03/2006, 10h01
  4. Probleme formulaire sous access 2003
    Par pedrosystem dans le forum Access
    Réponses: 2
    Dernier message: 28/02/2006, 18h02
  5. PB importation classeur excel sous access 2003
    Par techinfo37 dans le forum Access
    Réponses: 6
    Dernier message: 04/10/2005, 21h41

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