2008-12-03 7 views

Répondre

27

INTERSECT est une jointure interne. MINUS est une jointure externe, dans laquelle vous ne sélectionnez que les enregistrements qui n'existent pas dans l'autre table.


INTERSECT

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 initiale et postez quelques exemples de données alors un exemple peut être donné.

EDIT: oublié d'ajouter dans le distinct aux questions.

+0

Belle réponse :) –

+0

Pourquoi ça? La logique produit les mêmes résultats que le standard SQL INTERSECT et MINUS. – LeppyR64

+0

C'est exactement ce que je disais et j'ai été rejeté. Et bien. +1 pour vous, puisque vous avez pris le temps de donner des exemples de syntaxe, cependant. –

3

Ils sont exécutés via JOINs. La manière à l'ancienne :)

Pour INTERSECT, vous pouvez utiliser un INNER JOIN. Assez simple. Juste besoin d'utiliser un GROUP BY ou DISTINCT si vous n'avez pas une pure relation one-to-one continue. Sinon, comme d'autres l'ont mentionné, vous pouvez obtenir plus de résultats que prévu. 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.

+0

J'ai été rejeté aussi, mais votre réponse est correcte. – LeppyR64

0

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 joint les deux tables. tire des enregistrements qui n'existent que dans votre ensemble de données complet. Il en va de même pour INTERSECT, sauf que vous le feriez via une jointure interne et que vous ne retourneriez que les enregistrements qui existent dans les deux.

+0

Votre implémentation MINUS est trop compliquée. -1 – LeppyR64

+0

Ce n'est pas Access qui ne le supporte pas. Si vous écrivez un passthrough au serveur SQL en utilisant MINUS ou INTERSECT cela fonctionnera très bien. C'est le moteur de base de données Jet dont le dialecte SQL ne fait pas ces deux opérateurs. Tous les dialectes SQL sont incomplets donc ce n'est pas un gros problème avec Jet. –

12

INTERSECT n'est pas un INNER JOIN. Ils sont différents. Une INNER JOIN vous donnera des lignes dupliquées dans les cas où INTERSECT ne le fera 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 colonne ou les colonnes de clé primaire. S'il n'y a pas PK sur la table (! BAD), 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érification de 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 

Cela devrait le faire.

+0

Cheers, j'ai oublié d'ajouter le distinct dans mon message. +1 – LeppyR64

Questions connexes