Это разные запросы с разными результатами. С запросом IN вы получите 1 строку из таблицы 'a' всякий раз, когда предикат совпадает. С запросом INNER JOIN вы получите a * b строк всякий раз, когда условие соединения совпадает.
Так что со значениями в a {1,2,3} и b в {1,2,2,3} вы получите 1,2,2,3 из JOIN и 1,2,3 из IN.
РЕДАКТИРОВАТЬ - Я думаю, что вы можете встретить здесь несколько ответов, которые дадут вам неправильное представление. Попробуйте сами, и вы увидите, что все эти прекрасные планы запросов:
create table t1 (t1id int primary key clustered)
create table t2 (t2id int identity primary key clustered
,t1id int references t1(t1id)
)
insert t1 values (1)
insert t1 values (2)
insert t1 values (3)
insert t1 values (4)
insert t1 values (5)
insert t2 values (1)
insert t2 values (2)
insert t2 values (2)
insert t2 values (3)
insert t2 values (4)
select * from t1 where t1id in (select t1id from t2)
select * from t1 where exists (select 1 from t2 where t2.t1id = t1.t1id)
select t1.* from t1 join t2 on t1.t1id = t2.t1id
Первые два плана идентичны. Последний план представляет собой вложенный цикл, это различие ожидается, потому что, как я упоминал выше, соединение имеет другую семантику.