RESOLU [Access 2003] Requête jointure et union

RESOLU [Access 2003] Requête jointure et union - SQL/NoSQL - Programmation

Marsh Posté le 11-02-2011 à 17:21:19    

Bonjour,
 
Je coince sur un problème depuis un bon moment. Je vous expose ce que je veut faire. Regrouper les donnés de 3 tables comportant 2 champs avec une requête. Voici la structure des 3 tables :
 
Table 1              Table 2                    Table 3
Nom   Val1          Nom       Val2            Nom      Val3
A       12            A           48              A          62
B       10            C           69              B          19
C       32            D           78              D          23
D       50            G           67              F          21
E       55            H           18              G          11
 
Et je voudrais que la requête me donne le résultat suivant :
Nom    Val1       Val 2        Val 3
A        12         48            62
B        10                        19
C        32         69
D        50         78            23
E        55
F                                    21
G                    67            11
H                    18
 
Avec une requête UNION, chaque valeur dans le champ nom est dupliqué, sans "regroupement". car les enregistrements s'empilent à la suite sur 2 colonnes.
Avec une requête de jointure, je me rapproche de ce que je veut mais ça ne prend que les enregistrements qui sont en communs dans les 3 tables alors que je veut aussi les enregistrement qui se trouve isolés dans une table et non présents dans les autre.
 
Du coup je ne voit pas comment construire ma requête. J'utilise Access 2003.
J'ai lu qu'on pouvait faire des requêtes (Thêta) mais je ne sais pas si ça correspond à ma problématique, ni comment les faire.
J'espère que vous pourrez me donner la procédure ou des tutos sur ce problème.


Message édité par bpfonline le 12-02-2011 à 15:14:02
Reply

Marsh Posté le 11-02-2011 à 17:21:19   

Reply

Marsh Posté le 11-02-2011 à 23:00:06    

Il faudrait faire des jointures. Mais des jointures externes, des LEFT OUTER JOIN ou RIGHT OUTER JOIN, au lieu des INNER JOIN de base.
En choisissant la table 1 comme table principale de ces jointures, cela permettra de récupérer les cinq premières lignes de l'exemple.
Il manquera les 3 dernières lignes de l'exemple.
On pourra obtenir les 6e et 7e lignes en faisant un UNION avec une autre requête ayant des jointures externes dont la table principale sera la 3.
On pourra obtenir la 8e ligne de l'exemple en faisant un UNION avec encore une autre requête ayant des jointures externes, dont la table principale est la 2, cette fois-ci.
Pour éliminer les doublons, on fera un Select Distinct.

Reply

Marsh Posté le 12-02-2011 à 15:11:59    

billgatesanonym a écrit :

Il faudrait faire des jointures. Mais des jointures externes, des LEFT OUTER JOIN ou RIGHT OUTER JOIN, au lieu des INNER JOIN de base.
En choisissant la table 1 comme table principale de ces jointures, cela permettra de récupérer les cinq premières lignes de l'exemple.
Il manquera les 3 dernières lignes de l'exemple.
On pourra obtenir les 6e et 7e lignes en faisant un UNION avec une autre requête ayant des jointures externes dont la table principale sera la 3.
On pourra obtenir la 8e ligne de l'exemple en faisant un UNION avec encore une autre requête ayant des jointures externes, dont la table principale est la 2, cette fois-ci.
Pour éliminer les doublons, on fera un Select Distinct.


 
Bonjour,
 
Merci beaucoup pour la réponse qui m'a bien aidé.  :)  :)  :)  
J'ai commencé par faire les 3 requêtes avec des jointures gauches à partir du champ Nom comme référence pour chacune des tables.
RQT1 Nom (Table1) pointant vers Nom (Table2) et Nom (Table3)
RQT2 Nom (Table2) pointant vers Nom (Table1) et Nom (Table3)
RQT2 Nom (Table3) pointant vers Nom (Table1) et Nom (Table2)
 
Une fois testées individuellement, je les aient regroupés dans une Requête UNION unique. En copiant/collant le SQL des mes 3 Requêtes.
Je n'ai pas eu besoin de faire un Distinct pour les doublons par dessus.
Voici le code que j'ai obtenue :

Code :
  1. SELECT Table1.Nom, Table3.Val3, Table2.Val2, Table1.Val1
  2. FROM (Table1 LEFT JOIN Table3 ON Table1.Nom = Table3.Nom) LEFT JOIN Table2 ON Table1.Nom = Table2.Nom;
  3. UNION
  4. SELECT Table2.Nom, Table3.Val3, Table2.Val2, Table1.Val1
  5. FROM (Table2 LEFT JOIN Table3 ON Table2.Nom = Table3.Nom) LEFT JOIN Table1 ON Table2.Nom = Table1.Nom;
  6. UNION
  7. SELECT Table3.Nom, Table3.Val3, Table2.Val2, Table1.Val1
  8. FROM (Table3 LEFT JOIN Table1 ON Table3.Nom = Table1.Nom) LEFT JOIN Table2 ON Table3.Nom = Table2.Nom;


Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed