De um modo geral,
IN e JOIN são consultas diferentes que podem gerar resultados diferentes. SELECT a.*
FROM a
JOIN b
ON a.col = b.col
não é o mesmo que
SELECT a.*
FROM a
WHERE col IN
(
SELECT col
FROM b
)
, a menos que
b.col é único. No entanto, este é o sinônimo para a primeira consulta:
SELECT a.*
FROM a
JOIN (
SELECT DISTINCT col
FROM b
)
ON b.col = a.col
Se a coluna de junção for
UNIQUE e marcadas como tal, ambas as consultas geram o mesmo plano em SQL Server . Se não for, então
IN é mais rápido que JOIN em DISTINCT . Veja este artigo no meu blog para obter detalhes de desempenho:
INvs.JOINvs.EXISTS