WHERE id NOT IN (1, 2, NULL) раскрывается в id <> 1 AND id <> 2 AND id <> NULL. Последнее сравнение всегда даёт UNKNOWN, а WHERE пропускает только TRUE, поэтому запрос молча возвращает пустой результат. Одно неизвестное значение отравляет весь фильтр. Если в подзапросе возможен NULL, бери NOT EXISTS: он на NULL не ломается и читае…