Requête trois tables

Bonjour,

j'ai trois tables
table 1 : 8000 lignes représentant des clients
Table 2 : 350 lignes représentant des clients
Table 3 : 2500 lignes représentant des clients

j'ai créer une requête regroupant les trois tables
le résultat acces crée une requête avec 250 clients

Comment faire pour avoir une requête qui ramène les 8000 clients

merci de m'aider

16 réponses

  • Votes
  • Date
  • Date décroissante
Résumé de la discussion

Le problème consiste à récupérer les 8000 clients de la table principale tout en intégrant les informations des tables DEG et DGA via des jointures appropriées. Des échanges préconisent d'utiliser des LEFT JOIN plutôt que des INNER JOIN pour ne pas exclure les clients sans correspondance et préserver les 8000 enregistrements de la table principale. La meilleure approche avancée consiste à aligner les clés N° Compte entre DEDI, DEG et DGA et à obtenir la dernière date de l'année dans DGA pour éviter les doublons. En pratique, une requête propose d'utiliser FROM (DEDI LEFT JOIN DEG ON DEDI.[N° CLIENT] = DEG.[N° Compte]) LEFT JOIN DGA ON DEDI.[N° Compte] = DGA.[N° Compte], en sélectionnant la date maximale de DGA.

Bobot (l’IA à votre service)
  1. Modérateur
    Bonjour,

    Je n'utilise pas Access donc ne sais pas comment cela se présente dans ce logiciel.

    Mais pour faire ce que tu veux, il faut chercher vers les jointures externes. Une jointure classique (jointure interne) ramène les enregistrements qui ont une correspondance dans deux tables (ou plus). Une jointure externe ramène tous les enregistrements, même quand ils n'ont pas de correspondance dans l'une des 2 tables.

    cdlt
    1. merci pour votre réponse

      je viens de vérifier les jointures

      mais apparemment ce n'est pas ca le problème
      1. Contributeur
        bonjour, peux-tu partager le code SQL de ta requête?
        1. ce code a été généré par Access

          SELECT DEG.[N° Compte], DEDI.[RAISON SOCIALE], DEDI.TYPE, DEG.Activité, DEG.[Structure d'étude], DEG.Participation, DGA.Actionnariat, DGA.[Organe de décision], DGA.CMLT, DGA.CCT, DGA.EPS, DGA.Rééchelonnement, DEDI.[T/ EXPLOIT], DEDI.[T/ INVEST], DEDI.[T/ EXPLOIT], DEDI.[T / ENGAGEMENTS], DGA.[Révision garanties/ réserves], Max(DGA.Date) AS MaxDeDate
          FROM (DEDI INNER JOIN DEG ON DEDI.[N° CLIENT] = DEG.[N° Compte]) INNER JOIN DGA ON DEG.[N° Compte] = DGA.[N° Compte]
          GROUP BY DEG.[N° Compte], DEDI.[RAISON SOCIALE], DEDI.TYPE, DEG.[Structure d'étude], DEG.Participation, DGA.Actionnariat, DGA.[Organe de décision], DGA.CMLT, DGA.CCT, DGA.EPS, DGA.Rééchelonnement, DEDI.[T/ INVEST], DEDI.[T/ EXPLOIT], DEDI.[T / ENGAGEMENTS], DGA.[Révision garanties/ réserves], DEDI.[T/ EXPLOIT]
          HAVING (((DEG.[Structure d'étude])=[quelle structure?]));
        2. Contributeur
          @amo-51comme écrit par jee pee, il s'agit de jointures internes.
          je te suggère d'essayer en remplaçant (deux fois) INNER par LEFT.
        3. désolé pour le retard, perte de connexion internet

          je viens de changer INNER par LEFT en deux positions

          et voila access, me donne une requête de tous les clients les 8000 mais certains champs sont vides

          les champs en question sont ceux ramenées des autres tables
        4. Contributeur
          @amo-51tu voulais bien avoir les 8000 clients, donc tu progresses, on est d'accord?
          tu seras sans doute plus satisfait du résultat si, dans la requête, tu récupères le compte dans DEDI au lieu de DEG.
          afin d'avoir:
          SELECT DEDI.[N° Compte] ... GROUP BY DEDI.[N° Compte] ...
      2. est ce que les trois tables sont identiques dans leurs format de champs.
        y t il des risques de doublon.
        Supprime les clés primaires Faits des requetes ajout pour fusionner les trois tables
        1. Contributeur
          tu voulais bien avoir les 8000 clients, donc tu progresses, on est d'accord?
          tu seras sans doute plus satisfait du résultat si, dans la requête, tu récupères le compte dans DEDI au lieu de DEG.
          afin d'avoir:
          SELECT DEDI.[N° Compte] ... GROUP BY DEDI.[N° Compte] ...
          1. Bonjour les amis

            merci de vouloir m'aider
            je pense que j'ai un problème avec les relations entre les tables

            j'essaie de comprendre les relations access pour l'adapter a mon cas
          2. Contributeur
            @amo-51ceci m'avait semblé logique comme relation:
            FROM (DEDI LEFT JOIN DEG ON DEDI.[N° CLIENT] = DEG.[N° Compte]) LEFT JOIN DGA ON DEG.[N° Compte] = DGA.[N° Compte] 
          3. @amo-51bonjour
            Le plus souvent les relations se font un a plusieurs avec un champ N° auto dans la table principale et un champ numerique dans la table secondaire.
            Exemple dans une base données adresses j'ai une table ville et une table adresse.
            Table ville N°LisVil en auto comme clé primaire plus champ NomVille et CodePostal et une table adresse champ Nom, Prenom, Adresse, NomVille , code Postal et N°LisVil en numérique indexé à plusieurs. On fait la relation entre c'est 2 champs.
            Donc on peut ecrire plusieurs adresses issue d'une meme ville
          4. @yg_beoui elle est logique

            mais access me donne un tableau avec les champs sollicités sans les données à l’intérieur
            donc il y a un problème
            et je pense qu'il s'agit des relations
          5. @castoursj'ai cru comprendre qu'il y a trois types de relations
            1- Un à Un
            2- Un à plusieurs
            3- Plusieurs a plusieurs , et dans ce cas précis, il faudrait créer une table de jonction intégrant deux clés primaires issus de deux tables et qui deviennent des clés primaires dans la table jonction
            tout cela c'est dur pour moi, ca me prend du temps de l'appliquer sur mes propres tables
        2. Contributeur
          tu as 8000 clients dans ta table principale, DEDI
          pour certains de ces clients, tu as des informations dans deux autres tables, DEG et DGA.
          c'est exact?
          je suggère plutôt ceci:
          FROM (DEDI LEFT JOIN DEG ON DEDI.[N° CLIENT] = DEG.[N° Compte]) LEFT JOIN DGA ON DEDI.[N° Compte] = DGA.[N° Compte] 

          tu avais raison, la relation précédente n'était pas correcte.
          1. voila le message qui me fait maintenant lorsque j’exécute la requête:

            Microsoft Access ne peut pas représenter l’expression de la jointure DEDI.(N° Compte)= DGA. (N° Compte) en mode création :
            • un ou plusieurs champs ont peut être été supprimé ou renommé
            • le nom de un ou de plusieurs champs ou tables spécifiés dans l’expression de la jointure est peut être mal orthographié
            • La jointure utilise peut être un opérateur, tel que > ou < qui n’est pas géré en mode de création
          2. Contributeur
            @amo-51
            FROM (DEDI LEFT JOIN DEG ON DEDI.[N° CLIENT] = DEG.[N° Compte]) LEFT JOIN DGA ON DEDI.[N° CLIENT] = DGA.[N° Compte] 
        3. j'ai utilisé cet sql
          voir message retourné par access publié en 16:02
          1. Contributeur
            j'ai proposé à 17:08 un sql différent de celui que tu as testé avant 16:02.
            tu n'as pas répondu à la question posée à 15:38.
          2. j'ai répondu voir message 15h19
            j'ai testé les deux sql
            le premier erroné (requête vide)
            le deuxième : message d'erreur (voir contenu message 16 02
        4. Je m'immisce,

          mais je commencerais par renommer ces xxxxxxx champs avec des "°", ya rien de tel pour mettre le bouz...

          A+
          1. Contributeur
            tu as 8000 clients dans ta table principale, DEDI.
            pour certains de ces clients, tu as des informations dans deux autres tables, DEG et DGA.
            est-ce exact?
            je suggère plutôt ceci:
            FROM (DEDI LEFT JOIN DEG ON DEDI.[N° CLIENT] = DEG.[N° Compte]) LEFT JOIN DGA ON DEDI.[N° CLIENT] = DGA.[N° Compte]
            1. Bonjour
              j'ai déjà testé ce sql (voir mon precedent message)
              a titre de rappel, access me fait en retour le message suivant:

              Microsoft Access ne peut pas représenter l’expression de la jointure DEDI.(N° Compte)= DGA. (N° Compte) en mode création :
              un ou plusieurs champs ont peut être été supprimé ou renommé
              le nom de un ou de plusieurs champs ou tables spécifiés dans l’expression de la jointure est peut être mal orthographié
              La jointure utilise peut être un opérateur, tel que > ou < qui n’est pas géré en mode de création
            2. Contributeur
              @amo-51peux-tu répondre à la question posée?
              je pense que tu ne l'as pas testé: regarde bien: le message d'erreur ne correspond pas à la requête.
            3. non vous vous trompez j'ai bien testé
            4. Contributeur
              @amo-51peux-tu partager le code SQL de la requête testée?
            5. SELECT DEDI.[N° Compte]
              FROM DEDI LEFT JOIN DEG ON DEDI.[N° Compte] = DEG.[N° Compte]
              WHERE (((DEG.[N° Compte]) Is Null));
          2. au faite je pense avoir trouver la source de mon problème

            il s'agit de l’intégrité référentiel (le contenu des tables)
            1. bonjour
              c'est fort possible mais peut tu me faire parvenir ta base a castours arobase club-internet.fr.
              Je verrai mieux ton probleme
              1. Contributeur
                ou bien, amo-51, partager sur le forum un lien vers ton fichier.
              2. prière de me redonner votre émail
            2. Bonjour

              j'ai pas pu partager mon fichier

              dites moi comment faire
              1. Bonjour
                Tu compresse ton fichier en zip ou rar
                Tu vas dans cjoint et importe ta base compressée
                Tu créais le lien que tu copies et deposes dans un message de comment ca marche
                castours arobase club-internet .fr
            3. Contributeur
              ceci fonctionne:
              SELECT DEDI.[N° Compte],  DEDI.TYPE, DEG.Activité, DEG.[Structure d'étude], DEG.Participation, DGA.Actionnariat, DGA.[Organe de décision], DGA.CMLT, DGA.CCT, DGA.EPS, DGA.Rééchelonnement, DEDI.[T/ EXPLOIT], DEDI.[T/ INVEST], DEDI.[T/ EXPLOIT],  DGA.[Révision garanties/ réserves],DGA.Date
              FROM (DEDI left JOIN DEG ON DEDI.[N° Compte] = DEG.[N° Compte]) left JOIN DGA ON DEDI.[N° Compte] = DGA.[N° Compte]

              et il y a des doublons dans ta table DGA
              1. la table DGA contient des informations un peu spécial

                effectivement on peut trouver un n de compte deux ou quatre fois pour des dates différentes

                ce qui m’intéresse en définitif c'est le n de compte de la dernière date de l'année

                c'était quoi comme souci
                relation, jointure ou autre ?
              2. Contributeur
                @amo-51ceci donne-t-il ce que tu veux, ou pas?
                SELECT DEDI.[N° Compte], DEDI.TYPE, DEG.Activité, DEG.[Structure d'étude], DEG.Participation, DGA.Actionnariat, DGA.[Organe de décision], DGA.CMLT, DGA.CCT, DGA.EPS, DGA.Rééchelonnement, DEDI.[T/ EXPLOIT], DEDI.[T/ INVEST], DEDI.[T/ EXPLOIT], DGA.[Révision garanties/ réserves], DGA.Date
                FROM (DEDI LEFT JOIN DEG ON DEDI.[N° Compte] = DEG.[N° Compte]) LEFT JOIN DGA ON DEDI.[N° Compte] = DGA.[N° Compte] 
                and DGA.Date = dmax("Date","DGA",  "[N° Compte]='" & DEDI.[N° Compte] & "'") ;
              3. ca me donne une message d'erreur

                pourquoi ,"DGA" est seul la sql

                n y a t'il pas une erreur de saisie???????
              4. Contributeur
                @amo-51quel message d'erreur?
                chez moi, cela fonctionne dans le fichier que tu as envoyé:
                SELECT DEDI.[N° Compte], DEDI.TYPE, DEG.Activité, DEG.[Structure d'étude], DEG.Participation, DGA.Actionnariat, DGA.[Organe de décision], DGA.CMLT, DGA.CCT, DGA.EPS, DGA.Rééchelonnement, DEDI.[T/ EXPLOIT], DEDI.[T/ INVEST], DGA.[Révision garanties/ réserves], DGA.Date
                FROM (DEDI LEFT JOIN DEG ON DEDI.[N° Compte] = DEG.[N° Compte]) LEFT JOIN DGA ON (DGA.Date = dmax("Date","DGA",  "[N° Compte]='" & DEDI.[N° Compte] & "'")) AND (DEDI.[N° Compte] = DGA.[N° Compte]);
                
              5. essayer de passer en mode création

                vous avez inversez dedi et dga dans and
            4. SELECT NOM_client from table1 UNION SELECT NOM_client from Table2 UNION SELECT Nom_client FROM Table3 


              Ce n'est pas à un vieux singe qu'on apprend à faire des grimaces
              1. Bonjour
                C'est une solution
              2. Bonjour;

                je n'ai pas compris ton sql

                tu me propose de ramener uniquement les noms de chacune des tables
              3. @castoursmais je n'ai pas compris ta solution alors comment je pourrais l'essayer
              4. @amo-51bonjour
                ma solution consiste a faire 2 requete ajoute d'enregistrements.
                par contre il faut que tes trois tables soient identiques en champs et format
                si tu veux fait moi parvenir ta base compressée dans un lien de cjoint et je te ferai la manipe