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.