2010-08-25 7 views
0

J'ai une requête à laquelle je voudrais exclure les états américains. J'essaie de trouver toutes les données relatives aux pays autres que les États-Unis. J'ai les abréviations pour tous les États américains et peut lier la table à la requête et les exclure d'une manière ou d'une autre ou écrire une déclaration dans la requête pour les exclure. Mais, je ne sais pas comment faire non plus. Je pensais pouvoir faire Non "AK", "IA", "KY", "WA" mais ça ne marche pas. Aucune suggestion?MS Query pour exclure les abréviations d'état

Répondre

1

Pouvez-vous faire quelque chose comme ceci:

SELECT * from table1 as t1 
LEFT JOIN StatesTable as st 
ON t1.State = st.State 
WHERE st.id is null 

Vous pouvez également utiliser NOT IN mais i think that is a performance no-no. Exemple:

SELECT * FROM table1 where State NOT IN 
    (SELECT State from StatesTable) 
+0

Avec un ensemble d'enregistrements si petit, je doute fortement qu'il y ait une pénalité de performance pour l'équivalent NOT IN. La raison NOT IN doit être évitée autant que possible est que l'optimiseur de requête Jet/ACE pour une raison quelconque n'utilise pas de manière fiable les index des deux côtés de la comparaison. Avec le moins d'enregistrements impliqués dans une table d'états, je ne pense pas que cela puisse être un problème dans l'instance actuelle. Cela dit, je le ferais avec un JOIN moi-même plutôt qu'une sous-requête. J'utiliserais seulement une sous-requête quand j'avais besoin d'un ensemble de résultats modifiable et le JOIN l'aurait rendu non éditable. –

0

Je ne me souviens pas exactement ce que la syntaxe SQL MS-Access utilise, mais je pense que vous pouvez faire quelque chose comme

SELECT ... FROM ... WHERE StateAbbrev NOT IN ('AK', 'IA', 'KY', 'WA')

Si vous aviez les données d'état dans une table, vous pourriez retirez-le de plusieurs façons. En voici un:

SELECT ... FROM ... WHERE StateAbbrev NOT IN (SELECT Abbrev FROM States)

Il existe de nombreuses variantes de cette seconde méthode. C'est un et ça marche, ça échange de la lisibilité pour la performance.

+0

Access/Jet/ACE n'utilise pas T-SQL du tout. –

0

Est-ce que votre tableau d'états inclut des valeurs d'états non américains, comme les provinces canadiennes? Si tel est le cas, ajoutez un autre champ booléen à votre table states nommée isInUS et marquez comme vrai les 50 états aux États-Unis.

Ensuite, vérifiez les lignes dont la valeur d'état connexe ne se trouve pas aux États-Unis. Sinon, si votre table d'états contient 50 lignes, utilisez la jointure gauche Aaron publiée.

+0

Aaron n'a rien posté sur les jointures à gauche .... –

+0

oups, désolé. signifiait Abe. SELECT * à partir de la table1 en tant que t1 LEFT JOIN StatesTable as st – Beth