2009-11-09 12 views

Respuesta

5

Creo que sirve para el mismo propósito.

not in puede también toman valores literales mientras que not exists necesita una consulta para comparar los resultados con.

EDIT: not exists podría ser bueno para su uso, ya que puede join con la consulta externa & puede conducir al uso del índice, si el criterio utiliza la columna que está indexado.

EDIT2: Consulte this pregunta también.

EDIT3: Permítanme retomar las cosas anteriores.
Ver this enlace. Creo que todo depende de cómo la base de datos traduzca este & en base de datos/índices, etc.

+0

No se olvide de tratamiento de los nulos: http://stackoverflow.com/questions/1699424/what-the-difference -entre-no-en-y-no-existe-en-oracle-consulta/1703712 # 1703712 –

+0

El enlace de Tom Kyte definitivamente llega a la raíz del asunto. –

0

Puede haber diferencias de rendimiento, ya que existe es más rápido.

La diferencia más importante es el manejo de nulos. Es posible que su consulta parezca funcionar tanto con "in" como "exists", pero cuando su sub-consulta arroja un valor nulo, es posible que reciba un "shock".

Es posible que la existencia de causas nulas exista.

Consulte 'SQL for smarties' de Joe Celko para una mejor explicación de cuándo usar cada uno.

0

No está probando el presente de un elemento en un conjunto de elementos, por lo que es más simple.

No existe puede manejar consultas más complicadas, incluida la agrupación (por ejemplo, tener suma (x) = z o tener conteo (*)> 3), resultados con múltiples condiciones (por ejemplo, combinar elementos múltiples) y puede aprovechar los índices .

En algunas situaciones, no es más fácil hacer que no existe. Generalmente encuentro que es aquí donde estoy probando el valor de un campo clave en un conjunto de valores.

Como regla general, prefiero no existir ya que cubre muchas más situaciones que las que no. No existe puede utilizarse para todas las situaciones en las que no se usa, pero no a la inversa.

13

La diferencia entre NO EN y existe, no queda claro donde hay NULL los valores incluidos en el resultado.

Por ejemplo:

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); 

Nota: Se diferencia clave es que test_b contiene un valor null.

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

No hay filas devueltas

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

devoluciones

col1 
==== 
d 
e 
+0

@ Oro: creo que deberías aceptar esta respuesta, ayudará a los futuros visitantes a obtener directamente la diana. – hagrawal

Cuestiones relacionadas