11
votes

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

objectif:

L'intention de cette requête consiste à sélectionner toutes les valeurs distinctes dans une colonne qui n'existe pas dans une colonne similaire dans une table différente. < p> Query actuelle: xxx

résulte de requête:

Que se passe-t-il quand j'essaie Pour exécuter cette requête, la barre de progression se remplit presque immédiatement, mais elle gèle presque beaucoup et ne fait rien d'autre autant que je puisse voir. Lorsque j'utilise un signe = au lieu de <> il émet les valeurs égales à l'égalité et si je remplace la table2.column1 avec une valeur réelle réelle, il fonctionne simplement.

Je viens de le faire redevenir en tapant Cette question et la requête ci-dessus m'ont donné une réponse cette fois, mais il a toutes les valeurs distinctes de la colonne et non toutes les valeurs propres à ce tableau comme si cela devrait.

Des idées sur ce que je ' m faisant mal ou manquant ici?


1 commentaires

BTW, il est possible de faire des jointures non équitas, même si vous devez plonger dans la fenêtre SQL car il ne peut être représenté dans la vue de conception de l'accès à QBE. Ce que je fais toujours est de créer un Equi-Join, puis d'aller sur le SQL et de modifier = dans la jointure à <> ou> ou = et ainsi de suite.


3 Réponses :


17
votes

J'aime ce xxx

vous ne voulez pas exister, pas "pas égal"


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

comme cela signifie "de tous les combinaisons de chaque ligne de TABLE1 avec chaque ligne de Table2 ..." Habituellement, c'est beaucoup plus de résultat rangées que vous ne voulez jamais voir. Et dans le cas rare que vous voulez vraiment faire cela, la syntaxe la plus acceptée est la suivante: xxx


4 commentaires

Cela fonctionne merci. Mais pourquoi ne "pas égaler" ne fonctionne pas pour cela et comment est-il censé être utilisé?


Parce que "égal" ne signifie pas ce que vous pensez. "Equals" est un opérateur de comparaison scalaire, mais vous devez comparer des ensembles et leurs éléments. Existe est l'un des opérateurs qui vous permettent d'étendre un scalaire à un ensemble.


Cross Join n'est pas pris en charge dans Jet / Ace SQL.


Eh bien, tu m'as eu là-bas, je suppose que je ne l'ai jamais essayé jamais d'avoir accès. C'est à quel point c'est rare.



3
votes

Dans l'accès, vous trouverez probablement une jointure est plus rapide, à moins que vos tables ne soient très petites:

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


4 commentaires

Serais-je capable de faire cela avec trois tables facilement? J'ai utilisé deux tables pour faire passer le point, mais je le fais en fait avec trois tables. J'utilise la manière de Rbarry avec deux déclarations distinctes non existantes.


Barry's Way est certainement bon, mais pas si bon pour l'accès, à moins que le temps ne soit pas important. Oui, il est assez facile avec trois tables. Il peut être nécessaire de créer une sous-requête, cela dépend de la complexité du tout. Vous voudrez peut-être essayer de construire cela dans la fenêtre de conception de la requête. Vous pouvez créer la jointure en faisant glisser les champs d'une table à l'autre et choisissez le type de jointure en cliquant avec le bouton droit de la souris sur la ligne. Sinon, mettez à jour votre question pour montrer les trois tables et la façon dont vous voulez qu'ils travaillent ensemble.


En fait, Barry's Way ne prend pas vraiment longtemps longtemps, je vais juste rester en coller avec le non pas existant.


Si vous avez de la chance, vous n'existerez pas les index des deux côtés de la comparaison. Si vous n'êtes pas, vous aurez une vraie performance porc. Ce n'est pas totalement prévisible lorsque les index seront ou non utilisés, et comme modifient les statistiques de la table, les performances peuvent changer. Les deux n'existent pas et pas dans le cas où j'essaie d'éviter chaque fois qu'il y a une alternative (comme dans ce cas est dans ce cas).



0
votes

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

I Définissez les propriétés de jointure entre le tableau 1 et le tableau 2 du troisième réglage (3) (tous les champs du tableau 1 et uniquement les enregistrements du tableau 2 où les champs joints sont égaux) et placé A est null dans le champ Critère. de la requête dans le tableau 2 sur le terrain que je testais. Cela fonctionne parfaitement.

Merci à tout ce qui précède.


1 commentaires

Si vous passez à la vue SQL, vous constaterez que cela est identique à la réponse à gauche de Fionnuala.