¿Cuál es la diferencia entre 'no en' y 'no existe'?

¿Cuál es la diferencia entre not in y not exists en una consulta de Oracle?

¿Cuándo uso not in ? Y not exist ?

Creo que sirve el mismo propósito.

not in también puede tomar valores literales, mientras que not exists una consulta para comparar los resultados.

EDITAR: not exists podría ser bueno para usar porque puede join a la consulta externa y puede llevar al uso del índice, si el criterio usa una columna que está indexada.

EDIT2: Vea esta pregunta también.

EDIT3: Permítanme recuperar las cosas anteriores.
Ver este enlace Creo que todo depende de cómo la database traduce esto y en la database / índices, etc.

La diferencia entre NOT IN y NOT EXISTS queda clara cuando hay valores NULL 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 : La diferencia key es que test_b contiene un valor null .

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

No se devolvieron filas

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

Devoluciones

 col1 ==== d e 

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

No existe puede manejar consultas más complicadas, incluida la agrupación (por ejemplo, tener sum (x) = z o tener recuento (*)> 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 existir. Generalmente encuentro que es aquí donde estoy probando el valor de un campo key en un set de valores.

Como regla general, prefiero no existir, ya que cubre muchas más situaciones que las que no. No existe, se puede usar para todas las situaciones en las que no se usa, pero no al revés.

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

La diferencia más importante es el event handling 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".

Puede encontrar que la existencia de causas nulas existe para fallar.

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