Requête trois tables

amo-51 Messages postés 98 Statut Membre -  
 amo-51 -
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

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.

Généré automatiquement par IA
sur la base des meilleures réponses
  1. jee pee Messages postés 31883 Date d'inscription   Statut Modérateur Dernière intervention   9 979
     
    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
    0
  2. amo-51 Messages postés 98 Statut Membre
     
    merci pour votre réponse

    je viens de vérifier les jointures

    mais apparemment ce n'est pas ca le problème
    0
  3. Utilisateur anonyme
     
    Bonjour,

    Utilises une requête union...

    A+
    0
  4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    bonjour, peux-tu partager le code SQL de ta requête?
    0
    1. amo-51 Messages postés 98 Statut Membre
       
      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?]));
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > amo-51 Messages postés 98 Statut Membre
         
        comme écrit par jee pee, il s'agit de jointures internes.
        je te suggère d'essayer en remplaçant (deux fois) INNER par LEFT.
        0
    2. amo-51 Messages postés 98 Statut Membre
       
      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
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > amo-51 Messages postés 98 Statut Membre
         
        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] ...
        0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. castours
     
    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
    0
  7. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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] ...
    0
    1. amo-51 Messages postés 98 Statut Membre
       
      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
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > amo-51 Messages postés 98 Statut Membre
       
      ceci 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] 
      0
    3. castours > amo-51 Messages postés 98 Statut Membre
       
      bonjour
      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
      0
    4. amo-51 Messages postés 98 Statut Membre > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       
      oui 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
      0
    5. amo-51 Messages postés 98 Statut Membre > castours
       
      j'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
      0
  8. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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.
    0
    1. amo-51 Messages postés 98 Statut Membre
       
      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
      0
      1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > amo-51 Messages postés 98 Statut Membre
         
        FROM (DEDI LEFT JOIN DEG ON DEDI.[N° CLIENT] = DEG.[N° Compte]) LEFT JOIN DGA ON DEDI.[N° CLIENT] = DGA.[N° Compte] 
        0
  9. amo-51
     
    j'ai utilisé cet sql
    voir message retourné par access publié en 16:02
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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.
      0
    2. amo-51
       
      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
      0
  10. Utilisateur anonyme
     
    Je m'immisce,

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

    A+
    0
  11. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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]
    0
    1. amo-51
       
      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
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > amo-51
       
      peux-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.
      0
    3. amo-51
       
      non vous vous trompez j'ai bien testé
      0
    4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > amo-51
       
      peux-tu partager le code SQL de la requête testée?
      0
    5. amo-51
       
      SELECT DEDI.[N° Compte]
      FROM DEDI LEFT JOIN DEG ON DEDI.[N° Compte] = DEG.[N° Compte]
      WHERE (((DEG.[N° Compte]) Is Null));
      0
  12. amo-51
     
    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)
    0
  13. Castours
     
    bonjour
    c'est fort possible mais peut tu me faire parvenir ta base a castours arobase club-internet.fr.
    Je verrai mieux ton probleme
    0
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      ou bien, amo-51, partager sur le forum un lien vers ton fichier.
      0
    2. amo-51
       
      prière de me redonner votre émail
      0
  14. amo-51
     
    Bonjour

    j'ai pas pu partager mon fichier

    dites moi comment faire
    0
    1. castours Messages postés 2955 Date d'inscription   Statut Membre Dernière intervention   217
       
      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
      0
  15. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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
    0
    1. amo-51
       
      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 ?
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > amo-51
       
      ceci 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] & "'") ;
      0
    3. amo-51
       
      ca me donne une message d'erreur

      pourquoi ,"DGA" est seul la sql

      n y a t'il pas une erreur de saisie???????
      0
    4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > amo-51
       
      quel 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]);
      
      0
    5. amo-51
       
      essayer de passer en mode création

      vous avez inversez dedi et dga dans and
      0
  16. Utilisateur anonyme
     
    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
    1. castours
       
      Bonjour
      C'est une solution
      0
    2. amo-51 Messages postés 98 Statut Membre
       
      Bonjour;

      je n'ai pas compris ton sql

      tu me propose de ramener uniquement les noms de chacune des tables
      0
    3. castours > amo-51 Messages postés 98 Statut Membre
       
      bonjour
      As tu essayé ma solution?
      0
    4. amo-51 Messages postés 98 Statut Membre > castours
       
      mais je n'ai pas compris ta solution alors comment je pourrais l'essayer
      0
    5. castours > amo-51 Messages postés 98 Statut Membre
       
      bonjour
      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
      0