По логике говоря, ваш второй запрос почти такой же, как:
SELECT *
FROM TableA as a
LEFT JOIN TableB b
ON a.id = b.id
WHERE b.status IN (10, 100); -- b.status is null has been removed
Итак, проблема сводится к стандартной проблеме фильтрации в предложении ON
по сравнению с фильтрацией в предложении WHERE
. В первом случае все записи с левой стороны объединения будут сохранены, даже если логика ON
не будет выполнена. В последнем случае, который является случаем вашего второго запроса, соответствующие записи, которые не удовлетворяют условию status
, будут удалены и не будут отображаться в наборе результатов.
Я сказал почти то же самое, потому что проверка b.status IS NULL
, которую вы имели, фактически позволила бы выжить записям, которые соответствовали в условии соединения, но которые, как оказалось, имели null
значение для status
. Но, кроме этого, ваш вопрос на самом деле является лишь вопросом фильтрации в предложении ON
вместо выполнения этого в предложении WHERE
.