Esta es una de dos partes, sobre cómo usted puede hacer sus consultas mucho más eficientes. En la primera parte, nos fijaremos si es IN o NOT IN. La segunda parte la pueden encontrar aquí.

¿Qué es la cláusula IN?

La cláusula IN es un miembro de las sintaxis del lenguaje SQL y se puede utilizar en la cláusula WHERE para especificar los datos que desea incluir o excluir. (Hay otros usos también, incluidos en esta primera parte).

Dos Sintaxis Alternativas

Usted puede utilizar la cláusula IN especificando los criterios incluidos en la consulta. Por ejemplo, digamos que usted desea una lista de todos los pedidos del IL, Wisconsin y Minnesota.

 Podríamos hacerlo de esta manera:

SELECT *
FROM tblOrders
INNER JOIN tblCustomers
ON tblOrders.CustomerID = tblCustomers.CustomerID
WHERE tblCustomer.CustomerState = 'IL'
OR tblCustomer.CustomerState = 'WI'
OR tblCustomer.CustomerState = 'MN';

El problema con la consulta anterior es agregar un montón de estados que hacen una instrucción SQL muy larga. En su lugar se puede utilizar la cláusula IN como una expresión equivalente a la consulta anterior:

SELECT *
FROM tblOrders
INNER JOIN tblCustomers
ON tblOrders.CustomerID = tblCustomers.CustomerID
WHERE tblCustomers.CustomerState IN('IL','WI','MN');

Pero ¿qué pasa si usted no quiere las órdenes de esos estados? Se pueden combinar  con IN o  NOT IN como en la siguiente consulta:
SELECT *
FROM tblOrders
INNER JOIN tblCustomers
ON tblOrders.CustomerID = tblCustomers.CustomerID
WHERE CustomerState NOT IN('IL','WI','MN');

Sobre cargas

Los ejemplos anteriores son grandes maneras de utilizar la cláusula IN, pero usted puede sobre cargar su código mediante el uso de una instrucción SELECT en lugar  de enumerar los valores, de la siguiente manera:

SELECT *
FROM tblOrders
WHERE CustomerID IN(
SELECT CustomerID
FROM tblCustomers
WHERE CustomerState IN('IL','WI','MN')
);

Observe como no utilicé el INNER JOIN en mi instrucción SELECT y en cambio yo uso la cláusula IN para obtener todos los pedidos (table tblOrders) de los clientes que pertenecen a los estados en cuestión.

Utilice IN para consultar en las tablas y no en la instrucción de SELECT.

Hay muchas situaciones en las que se necesita evitar un JOIN en su consulta, aquí les muestro dos:

  1. Es necesario que los usuarios editen los datos de sus formularios y usando un JOIN solo harán que sea de lectura.
  2. Una o más tablas no se almacenan juntas. Por ejemplo: la tabla Order podría estar en el  SQL Server y la tabla clientes localmente en Access.Un JOIN de este tipo sería lento y no es óptimo.

Utilice IN para filtrar sus formularios

Una de mis técnicas favoritas es filtrar un formulario utilizando la cláusula WHERE de la instrucción DoCmd.OpenForm. Por ejemplo, el otro día yo estaba construyendo un panel para un cliente bancario que incluye un recuento de los préstamos en mora en el sistema. Hice el número del banco clickeable, lo que permite a los usuarios lanzar el evento frmLoans de los formularios con la lista de los préstamos en mora con la siguiente línea:

:

DoCmd.OpenForm _
FormName:="frmLoans", _
WhereCondition:="LoanID IN(SELECT LoanID FROM vw_DelinquentLoans)"

Tenga en cuenta que los datos están contenidos en una vista de SQL Server que está vinculada en Access Front-End. En lugar de un JOIN a la vista que puede provocar un rendimiento inferior al óptimo, la cláusula IN asegurar que la lista de LoanIDs se evalué una sola vez.

Utilice IN para evitar duplicados en las consultas que tienen una cláusula GROUP BY

Muchas veces usted verá una consulta que contiene una cláusula GROUP BY que necesita registros únicos, pero usted va a encontrar varios registros debido a los JOINS con otras tablas. Considere el uso de la cláusula IN en lugar de un JOIN a una o más tablas.

¿Entonces que prefiere utilizar IN o NOT IN?

http://www.youtube.com/watch?v=9mKGhfKn3Kk

¡Manténgase atento para la segunda parte!