J'ai fait des recherches et je n'ai pas trouvé de moyen d'exécuter les opérations INTERSECT et MINUS dans MS Access. Existe-t-il un moyen
INTERSECT est une jointure interne. MINUS est une jointure externe, dans laquelle vous choisissez uniquement les enregistrements qui n'existent pas dans l'autre table.
select distinct
a.*
from
a
inner join b on a.id = b.id
MOINS
select distinct
a.*
from
a
left outer join b on a.id = b.id
where
b.id is null
Si vous modifiez votre question d'origine et publiez des exemples de données, un exemple peut être donné.
EDIT: J'ai oublié d'ajouter le caractère distinct aux requêtes.
INTERSECT N'EST PAS une INNER JOIN. Ils sont différents. Une INNER JOIN vous donnera des lignes en double dans les cas où INTERSECT NE SERA PAS. Vous pouvez obtenir des résultats équivalents en:
SELECT DISTINCT a.*
FROM a
INNER JOIN b
on a.PK = b.PK
Notez que PK doit être la ou les colonnes de clé primaire. S'il n'y a pas de PK sur la table (MAUVAIS!), Vous devez l'écrire comme ceci:
SELECT DISTINCT a.*
FROM a
INNER JOIN b
ON a.Col1 = b.Col1
AND a.Col2 = b.Col2
AND a.Col3 = b.Col3 ...
Avec MINUS, vous pouvez faire la même chose, mais avec un LEFT JOIN et une condition WHERE vérifiant la valeur null sur l'une des colonnes non nullables de la table b (de préférence la clé primaire).
SELECT DISTINCT a.*
FROM a
LEFT JOIN b
on a.PK = b.PK
WHERE b.PK IS NULL
Ça devrait le faire.
Ils se font via JOINs. À l'ancienne :)
Pour INTERSECT, vous pouvez utiliser un INNER JOIN. Assez simple. Il vous suffit d'utiliser un GROUP BY ou un DISTINCT si vous n'avez pas de relation un à un en cours. Sinon, comme d'autres l'ont mentionné, vous pouvez obtenir plus de résultats que vous ne le pensez.
Pour MINUS, vous pouvez utiliser un LEFT JOIN et utiliser le WHERE pour le limiter afin de ne récupérer que les lignes de votre table principale qui ne correspondent pas à la table LEFT JOINed.
Peasy facile.
Malheureusement, MINUS n'est pas pris en charge dans MS Access - une solution consiste à créer trois requêtes, une avec l'ensemble de données complet, une qui extrait les lignes que vous souhaitez filtrer, et une troisième qui reste joint les deux tables et extrait uniquement les enregistrements qui ne existent dans votre ensemble de données complet.
La même chose vaut pour INTERSECT, sauf que vous le feriez via une jointure interne et ne renvoyant que les enregistrements qui existent dans les deux.