Requête trois tables
amo-51 -
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
- Access relation entre 3 tables
- Ai suite 3 - Télécharger - Optimisation
- Access appdata - Guide
- Emoji 3 - Forum Mail
- Picasa 3 - Télécharger - Albums photo
- Acer quick access - Forum Logiciels
16 réponses
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.
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
je viens de vérifier les jointures
mais apparemment ce n'est pas ca le problème
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?]));
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questiony t il des risques de doublon.
Supprime les clés primaires Faits des requetes ajout pour fusionner les trois tables
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] ...
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
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
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.
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
mais je commencerais par renommer ces xxxxxxx champs avec des "°", ya rien de tel pour mettre le bouz...
A+
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]
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
il s'agit de l’intégrité référentiel (le contenu des tables)
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
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] & "'") ;
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]);