web-dev-qa-db-fra.com

Comment puis-je implémenter les opérations SQL INTERSECT et MINUS dans MS Access

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

21
Varun Mahajan

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.


COUPER
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.

31
LeppyR64

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.

14
Dave Markle

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.

3
Kevin Fairchild

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.

0
Patrick Harrington