Давайте подставим pk
- первичный ключ для Contracts
(или уникальное поле или набор полей).Тогда искомый запрос без коррелированных подзапросов:
select C.pk, C.StartDate, C.EndDate,
Coalesce( Count(d.Date), 0 ) as BizDaysBetween
from Contracts C
left outer join CalandarDays d
on d.Date >= c.StartDate
and d.Date < c.EndDate
and d.IsBizDay
group by C.pk, C.StartDate, C.EndDate
Почему соединение вместо коррелированного подзапроса?
Цитирование Коррелированная Википедиястатья подзапроса :
В запросе базы данных SQL коррелированный подзапрос (также известный как синхронизированный подзапрос) - это подзапрос (запрос, вложенный в другой запрос), который использует значения из внешнего запроса,Поскольку подзапрос может оцениваться один раз для каждой строки, обрабатываемой внешним запросом, он может быть неэффективным.
Не забудьте создать правильные индексы.Для CalandarDays
индекс может быть составлен из (IsBizDay, Date)
.
Почему осталось объединение и объединение?
Поскольку, возможно, они не являются рабочим днемдиапазон.