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?
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.
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
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;