web-dev-qa-db-fra.com

Comment utiliser correctement "Pas égal" dans MS Access?

Objectif:

Le but de cette requête est de sélectionner toutes les valeurs distinctes d'une colonne qui n'existent pas dans une colonne similaire d'une autre table.

Requête en cours:

SELECT DISTINCT Table1.Column1
FROM Table2, Table1
WHERE Table1.Column1 <> Table2.Column1 

Résultats d'une requête:

Lorsque j'essaie d'exécuter cette requête, que se passe-t-il, la barre de progression se remplit presque immédiatement, mais elle se bloque alors et ne fait rien d'autre à ma connaissance. Lorsque j'utilise un signe = au lieu de <>, les valeurs égales sont correctes et si je remplace Table2.Column1 par une valeur réelle, cela fonctionne parfaitement.

Je viens de l'exécuter à nouveau en tapant cette question et la requête ci-dessus m'a donné une réponse cette fois-ci, mais toutes les valeurs DISTINCT de la colonne ne sont pas toutes les valeurs propres à cette table, comme il se doit.

Des idées sur ce que je fais mal ou manque ici?

10
Bryan

Comme ça

SELECT DISTINCT Table1.Column1
FROM Table1
WHERE NOT EXISTS( SELECT * FROM Table2
    WHERE Table1.Column1 = Table2.Column1  )

Vous voulez PAS EXISTE, pas "pas égal"


Au fait, vous voulez rarement écrire une clause FROM comme celle-ci:

FROM Table1, Table2

car cela signifie "FROM all combinaisons de toutes les lignes de Table1 avec toutes les lignes de Table2 ...", ce qui est généralement bien plus que ce que vous souhaitez voir. Et dans les rares cas où vous voulez vraiment faire cela, la syntaxe la plus acceptée est:

FROM Table1 CROSS JOIN Table2
17
RBarryYoung

Dans Access, vous constaterez probablement qu'une jointure est plus rapide, à moins que vos tables soient très petites:

SELECT DISTINCT Table1.Column1
FROM Table1 
LEFT JOIN Table2
ON Table1.Column1 = Table2.Column1  
WHERE Table2.Column1 Is Null

Cela exclura de la liste tous les enregistrements avec une correspondance dans la Table2.

2
Fionnuala

J'ai eu du mal à obtenir une requête pour renvoyer des champs du tableau 1 qui n'existent pas dans le tableau 2 et j'ai essayé la plupart des réponses ci-dessus jusqu'à ce que je trouve un moyen très simple d'obtenir les résultats souhaités.

Je règle les propriétés de jointure entre les tables 1 et 2 sur le troisième paramètre (3) (Tous les champs du tableau 1 et uniquement les enregistrements du tableau 2 où les champs joints sont égaux) et place un Is Null dans le champ critère de la requête dans le tableau 2 dans le domaine que je testais. Ça fonctionne parfaitement.

Merci à tous ci-dessus cependant.

0
Fred Mason