Cuando no necesitamos sacar ninguna columna de alguna de las tablas de nuestra consulta y solo la usamos para filtrar, es aconsejable utilizar el EXISTS.

 

Por ejemplo, para devolver los artículos que estén en líneas de pedidos en estado generado, se suele hacer lo siguiente:

 

 

SELECT DISTINCT A.IdArticulo

FROM Articulos A INNER JOIN Pedidos_Cli_Lineas L ON A.IdArticulo=L.IdArticulo

WHERE L.IdEstado=0

 

Ó

 

SELECT IdArticulo

FROM Articulos WHERE IdArticulo IN (SELECT IdArticulo FROM Pedidos_Cli_Lineas WHERE IdEstado=0)

 

  

Pero suele ser más eficiente hacer lo siguiente:

 

SELECT A.IdArticulo 

FROM Articulos A

WHERE EXISTS (SELECT 1 FROM Pedidos_Cli_Lineas L WHERE L.IdArticulo =A.IdARticulo AND IdEstado =0)

 

De esta manera en cuanto se encuentra el artículo en una línea de pedido, se detiene la evaluación del resto de registros y se pasa al siguiente artículo. Del mismo modo, una cláusula IF EXISTS … es más rápido que un SELECT COUNT (*) porque en el momento en que se encuentra el primer registro la consulta finaliza, mientras que con un COUNT(*) debe contar todas las filas.

Siguiente artículo >>