Vous pouvez aussi simplement placer le premier SELECT dans une sous-requête. Comme la plupart des optimiseurs le transformeront de toute façon en une constante, il ne devrait pas y avoir d'impact sur les performances.
Au fait, puisque vous utilisez un prédicat comme celui-ci :
CONVERT(...) = CONVERT(...)
cette expression de prédicat ne peut pas être optimisée correctement ou utiliser des index sur les colonnes référencées par la fonction CONVERT().
Voici une façon d'améliorer quelque peu la requête originale :
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
Cette version pourrait s'appuyer sur un index qui fait intervenir FaultDate, et atteint le même objectif.
Le voici, réécrit pour utiliser une sous-requête afin d'éviter la déclaration de variable et le SELECT ultérieur.
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
Notez que cette approche présente le même problème d'utilisation d'index que l'original, en raison de l'utilisation de CONVERT() sur FF.FaultDate. Il est possible de remédier à ce problème en ajoutant deux fois la sous-requête, mais il est préférable d'utiliser l'approche variable dans ce cas. Cette dernière version est uniquement destinée à la démonstration.
Regards.