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:
IN
vs.JOIN
vs.EXISTS