Jointure externe complète dans MS Access


11

J'ai deux listes d'employés:

List A:

StaffID   Supervisor
====================
0001234         NULL
0001235      0001234
0001237      0001234
0001239      0001237

et

List B:

StaffID   Supervisor
====================
0001234         NULL
0001235      0001234
0001238      0001235
0001239      0001235

Et j'ai besoin de la sortie suivante:

StaffID   SupervisorA   SupervisorB
===================================
0001234          NULL          NULL
0001235       0001234       0001234
0001237       0001234          NULL
0001238          NULL       0001235
0001239       0001237       0001235

Notez que les ID du personnel de la liste A et de la liste B ont été fusionnés en une seule liste non répétitive et que j'ai fusionné les deux détails du superviseur qui peuvent ne pas correspondre entre les deux listes.

La requête n'a pas besoin d'être agréable. J'ai environ 8 000 enregistrements dans chaque liste et je vais l'exécuter correctement. Je suis heureux de faire quelques manipulations Excel mineures par la suite si nécessaire.

Je voulais faire une jointure complète, mais la fenêtre des propriétés du concepteur de requêtes Access sur la jointure me permet de choisir TOUT dans la table A et la correspondance dans la table B, TOUT dans la table B et la correspondance dans la table A, ou uniquement celles qui correspondent dans les deux A et B.

Je suis sûr que c'est très simple à faire, mais j'utilise très rarement MS Access.

Jusqu'à présent, j'ai deux requêtes qui ne me donnent pas ce que je veux. Je voulais les combiner dans la jointure externe complète, car Access ne me donnera pas d'option, mais je ne sais pas comment:

SELECT ListA.*, ListB.*
FROM ListA LEFT JOIN ListB ON ListA.[StaffID] = ListB.StaffID;

et

SELECT ListA.*, ListB.*
FROM ListB LEFT JOIN ListA ON ListB.[StaffID] = ListA.StaffID;

Réponses:


10

La dernière fois que j'ai joué avec Access, c'était lorsque 2003 était la nouvelle nouveauté, donc cela peut ne pas être entièrement précis dans les moindres détails. Cependant, ce que vous devez faire est d'aller dans le concepteur de requêtes, de changer la vue en "SQL" (c'est-à-dire une entrée de texte brut) et ensuite vous voulez UNIONvos deux requêtes de jointure gauche ensemble, par exemple

SELECT ListA.*, ListB.*
FROM ListA LEFT JOIN ListB ON ListA.[StaffID] = ListB.StaffID
UNION
SELECT ListA.*, ListB.*
FROM ListB LEFT JOIN ListA ON ListB.[StaffID] = ListA.StaffID

J'adore que la réponse puisse être réduite à un seul mot: "UNION", ce qui est exactement ce que je voulais :)
Ozzah

1
Aucun problème. Ce serait bien si Access supportait les jointures externes complètes, mais ce serait bien aussi si j'avais un poney aussi. (PS: ne demandez même pas comment faire des jointures croisées dans Access, c'est modérément horrible.)
Simon Righarts

1
SELECT S.StaffId
     , ListA.Supervisor AS SupervisorA 
     , ListB.Supervisor AS SupervisorB
FROM 
    ( SELECT StaffID
      FROM ListA 
    UNION 
      SELECT StaffID
      FROM ListB
    ) AS S
  LEFT JOIN ListA 
    ON ListA.StaffID = S.StaffID
  LEFT JOIN ListB 
    ON ListB.StaffID = S.StaffID

0

Avez-vous essayé de concevoir la requête en mode SQL au lieu d'utiliser la vue concepteur?

Si vous utilisez Access 2003 / XP / 2000/97, jetez un œil à ceci: http://www.techonthenet.com/access/queries/view_sql.php

Si vous utilisez Access 2007/2010, vous pouvez le faire en cliquant sur la flèche du bouton Afficher à gauche du ruban. Cliquez ensuite sur Vue SQL.


0
SELECT ListA.*, ListB.*
FROM ListA LEFT JOIN ListB ON ListA.[StaffID] = ListB.[StaffID]
UNION
SELECT ListA.*, ListB.*
FROM ListA RIGHT JOIN ListB ON ListA.[StaffID] = ListB.[StaffID];

0
SELECT ListA.staffID, ListA.Supervisor, ListB.Supervisor
FROM ListA LEFT JOIN ListB ON ListA.staffID = ListB.staffID
WHERE (((ListB.staffID) Is Null))
UNION
SELECT ListB.staffID, ListA.Supervisor, ListB.Supervisor
FROM ListA RIGHT JOIN ListB ON ListA.staffID = ListB.staffID
WHERE (((ListA.staffID) Is Null))
UNION
SELECT ListA.staffID, ListA.Supervisor, ListB.Supervisor
FROM ListA INNER JOIN ListB ON ListA.staffID = ListB.staffID
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.