2009-11-09 5 views

Répondre

5

Je pense que cela sert le même but.

not in peut aussi prennent des valeurs littérales alors not exists besoin d'une requête pour comparer les résultats avec.

EDIT: not exists pourrait être bon à utiliser, car il peut join avec la requête externe & peut conduire à l'utilisation de l'indice, si les critères utilise la colonne qui est indexé.

EDIT2: Voir aussi la question this.

EDIT3: Laissez-moi prendre les choses ci-dessus.
Voir this lien. Je pense que tout dépend de la façon dont la base de données traduit ce & sur la base de données/les index, etc.

+0

Ne pas oublier le traitement des valeurs nulles: http://stackoverflow.com/questions/1699424/what-the-difference -between-not-in-and-not-exists-in-oracle-query/1703712 # 1703712 –

+0

Le lien Tom Kyte va définitivement à la racine du problème. –

0

Il peut y avoir des différences de performances, car existe existe plus rapidement.

La différence la plus importante est la gestion des valeurs nulles. Votre requête peut sembler fonctionner de la même manière avec et dans, mais lorsque votre sous-requête renvoie null, vous pourriez avoir un choc.

Vous pouvez constater que l'existence de causes NULL existe pour échouer.

Voir le 'SQL for smarties' de Joe Celko pour une meilleure explication de quand utiliser chacun.

0

Not in teste la présence d'un élément dans un ensemble d'éléments, donc c'est plus simple. Existe peut gérer des requêtes plus compliquées, y compris le regroupement (par exemple sum (x) = z ou ayant count (*)> 3), résultats avec des conditions multiples (par exemple correspondant à plusieurs éléments), et peut tirer parti des index .

Dans certaines situations, il n'est pas plus facile de faire que de ne pas exister. Je trouve généralement que c'est là que je teste la valeur d'un champ clé dans un ensemble de valeurs.

En règle générale, je préfère ne pas exister car il couvre beaucoup plus de situations que non. Non existe peut être utilisé pour toutes les situations qui ne sont pas utilisées, mais pas l'inverse.

13

La différence entre PAS et PAS EXISTE devient clair où il y a NULL valeurs incluses dans le résultat.

Par exemple:

create table test_a (col1 varchar2(30 char)); 
create table test_b (col1 varchar2(30 char)); 

insert into test_a (col1) values ('a'); 
insert into test_a (col1) values ('b'); 
insert into test_a (col1) values ('c'); 
insert into test_a (col1) values ('d'); 
insert into test_a (col1) values ('e'); 

insert into test_b (col1) values ('a'); 
insert into test_b (col1) values ('b'); 
insert into test_b (col1) values ('c'); 
insert into test_b (col1) values (null); 

Remarque: Ils différence essentielle est que test_b contient une valeur null.

select * from test_a where col1 not in (select col1 from test_b); 

Aucune ligne retourné

select * from test_a where 
    not exists 
     (select 1 from test_b where test_b.col1 = test_a.col1); 

Retours

col1 
==== 
d 
e 
+0

@Gold: Je pense que vous devriez accepter cette réponse, aidera les futurs visiteurs à obtenir directement l'oeil du taureau. – hagrawal