К сожалению для вас, Алекс, у вас есть правильное решение: коррелированные подзапросы, в зависимости от их структуры, будут запускаться несколько раз, что потенциально даст вам сотни отдельных запросов.
Поместите текущее решение в Query Analyzer, включите «Показать план выполнения» (Ctrl + K) и запустите его. Внизу у вас будет дополнительная вкладка, которая покажет вам, как движок собирал ваши результаты. Если вы сделаете то же самое с коррелированным подзапросом, вы увидите, что делает эта опция.
Я полагаю, что таблица #Periods может забить столько раз, сколько отдельных строк в этой таблице.
Кроме того, что-то не так в коррелированном подзапросе, мне кажется. Поскольку я избегаю их как чумы, зная, что они злые, я не знаю, как их исправить.