web-dev-qa-db-fra.com

Comment écrire une requête de jointure externe complète dans Access

Requête d'origine:

SELECT * 
FROM AA
FULL OUTERJOIN BB on (AA.C_ID = BB.C_ID);  

Comment convertir la requête ci-dessus pour la rendre compatible dans Microsoft Access?

Je suppose:

SELECT *
FROM AA
FULL LEFT JOIN BB ON (AA.C_ID = BB.C_ID);

Je n'ai pas traité les critères "COMPLET" avant de convertir correctement la première requête en une requête compatible avec Access?

26
user2924488

En supposant qu'il n'y ait pas de lignes en double dans AA et BB (c'est-à-dire toutes les mêmes valeurs), une jointure externe complète est l'équivalent de l'union d'une jointure gauche et d'une jointure droite.

SELECT *
    FROM AA
        LEFT JOIN BB ON AA.C_ID = BB.C_ID
UNION
SELECT *
    FROM AA
        RIGHT JOIN BB ON AA.C_ID = BB.C_ID

S'il y a des lignes en double (et que vous souhaitez les conserver), ajoutez WHERE AA.C_ID IS NULL à la fin, ou un autre champ qui n'est nul s'il n'y a pas d'enregistrement correspondant de AA.

MODIFIER:

Voir une approche similaire ici .

Il recommande le plus verbeux, mais le plus performant

SELECT *
    FROM AA
        JOIN BB ON AA.C_ID = BB.C_ID
UNION ALL
SELECT *
    FROM AA
        LEFT JOIN BB ON AA.C_ID = BB.C_ID
    WHERE BB.C_ID IS NULL
UNION ALL
SELECT *
    FROM AA
        RIGHT JOIN BB ON AA.C_ID = BB.C_ID
    WHERE AA.C_ID IS NULL

Cependant, cela suppose que AA.C_ID et BB.C_ID ne sont pas nuls.

31
Paul Draper

Le code le plus efficace et le plus rapide:

SELECT *
    FROM AA
        LEFT JOIN BB ON AA.C_ID = BB.C_ID
UNION ALL
SELECT *
    FROM AA
        RIGHT JOIN BB ON AA.C_ID = BB.C_ID
    WHERE AA.C_ID IS NULL
8
user6012447

J'ai trouvé que si les noms de champ sont les mêmes dans les deux tables, ils devront être répertoriés individuellement plutôt que d'utiliser l'opérateur *. En outre, la deuxième instruction SELECT doit faire référence à l'autre table. Le simple fait d'utiliser le même SQL que le premier et de le changer en RIGHT JOIN ne permet pas l'inclusion des lignes dans la table BB.

SELECT AA.C_ID
FROM AA
LEFT JOIN BB ON 
  AA.C_ID = BB.C_ID
UNION ALL 
SELECT BB.C_ID
FROM BB
LEFT JOIN AA ON 
  AA.C_ID = BB.C_ID
WHERE AA.C_ID IS NULL;
1
Casey35