2010-02-10 7 views
2

J'ai une liste de valeurs, et je veux savoir lesquelles n'existent pas déjà dans la table. (Ceci est sur le serveur SQL 2000)Lesquelles de ces valeurs ne sont PAS dans la table?

Considérez ce qui suit:

CREATE TABLE myTable (foo VARCHAR(10)) 
GO 

INSERT INTO myTable 
     (foo 
     ) 
     SELECT 'aaa' 
     UNION ALL SELECT 'bbb' 
     UNION ALL SELECT 'ccc' 
GO 

SELECT foo 
    FROM myTable 
    WHERE foo IN ('aaa', 'cat', 'bbb', 'dog') 
-- returns 'aaa' and 'bbb' 

Je dois écrire une requête qui retourne « chat » et « chien ».

SELECT foo 
    FROM myTable 
    WHERE foo ????? ('aaa', 'cat', 'bbb', 'dog') 
-- returns 'cat' and 'dog' 

Existe-t-il un moyen simple de faire cela dans une requête?

En raison de la façon dont l'application interagit avec la base de données, je préfère ne pas, par exemple, créer une table temporaire

+0

la liste des valeurs petites? Si c'est le cas, vous pouvez simplement récupérer ceux qui existent déjà depuis la base de données, puis faire le filtrage dans l'application à la place, sans perte de performance perceptible. – Journey

Répondre

6

Vous pouvez construire une table avec union all et se joindre à ce sujet, le filtrage sur les lignes qui ne sont pas couvertes par la jointure:

SELECT  myList.foo 
FROM  (
       SELECT 'aaa' as foo 
       UNION ALL SELECT 'cat' 
       UNION ALL SELECT 'bbb' 
       UNION ALL SELECT 'dog' 
      ) myList 
LEFT JOIN myTable 
ON   myTable.foo = myList.foo 
WHERE  myTable.foo is null 
0

EXISTE est la chose (pas les, en fait)

select foo from myTable 
WHERE NOT EXISTS (select 1 from myTable where foo in('cat', 'dog')); 

Non la manière la plus propre, ni la plus propre. Soehow, ça pourrait marcher.

+1

Si je sais déjà quels sont ceux à rechercher ... Je n'ai pas besoin de cette requête :-) – Sukotto

+0

Désolé, vous avez raison. Lecture rapide = choses incomplètes * alfabravo rougit * – Alfabravo

Questions connexes