Вы также можете просто поместить первый SELECT в подзапрос. Поскольку большинство оптимизаторов в любом случае сворачивают его в константу, это не должно сказываться на производительности.
Кстати, поскольку вы используете предикат, подобный этому:
CONVERT(...) = CONVERT(...)
, что выражение предиката не может быть должным образом оптимизировано или использовать индексы для ссылки на столбцы с помощью функции CONVERT ().
Вот один из способов улучшить исходный запрос:
DECLARE @ooDate datetime
SELECT @ooDate = OO.Date FROM OLAP.OutageHours AS OO where OO.OutageID = 1
SELECT
COUNT(FF.HALID)
FROM
Outages.FaultsInOutages AS OFIO
INNER JOIN Faults.Faults as FF ON
FF.HALID = OFIO.HALID
WHERE
FF.FaultDate >= @ooDate AND
FF.FaultDate < DATEADD(day, 1, @ooDate) AND
OFIO.OutageID = 1
Эта версия может использовать индекс, который включает FaultDate и достигает той же цели.
Здесь переписано, чтобы использовать подзапрос, чтобы избежать объявления переменной и последующего SELECT.
SELECT
COUNT(FF.HALID)
FROM
Outages.FaultsInOutages AS OFIO
INNER JOIN Faults.Faults as FF ON
FF.HALID = OFIO.HALID
WHERE
CONVERT(varchar(10), FF.FaultDate, 126) = (SELECT CONVERT(varchar(10), OO.Date, 126) FROM OLAP.OutageHours AS OO where OO.OutageID = 1) AND
OFIO.OutageID = 1
Обратите внимание, что этот подход имеет ту же проблему использования индекса, что и оригинал, из-за использования CONVERT () для FF.FaultDate. Это можно исправить, добавив подзапрос дважды, но в этом случае вам лучше использовать переменный подход. Эта последняя версия предназначена только для демонстрации.
Привет.