Quelle est la différence entre not in
et not exists
dans une requête Oracle?Quelle est la différence entre «not in» et «not exists»?
Quand dois-je utiliser not in
? Et not exist
?
Quelle est la différence entre not in
et not exists
dans une requête Oracle?Quelle est la différence entre «not in» et «not exists»?
Quand dois-je utiliser not in
? Et not exist
?
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.
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.
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.
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
@Gold: Je pense que vous devriez accepter cette réponse, aidera les futurs visiteurs à obtenir directement l'oeil du taureau. – hagrawal
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 –
Le lien Tom Kyte va définitivement à la racine du problème. –