我有一个包含多个CTE的相当复杂的查询,但是其他人都从中提取了1个主要CTE,这是否会导致该主要CTE多次执行?
您可以这样使用CROSS JOIN:
SELECT AVG(CASE WHEN instructorID = @instructorID THEN score END) InstructorSemesterAverage, STDEVP(CASE WHEN instructorID = @instructorID THEN score END) InstructorSemesterSTDeviation, AVG(CASE WHEN subjectCode = @subjectCode THEN score END) DepartmentSemesterAverage, STDEVP(CASE WHEN subjectCode = @subjectCode THEN score END) DepartmentSemesterSTDeviation, AVG(CASE WHEN bannerCRN=@CRN AND Q.year = @year AND semester = @semester THEN score END) ClassScore, STDEVP(CASE WHEN bannerCRN=@CRN AND Q.year = @year AND semester = @semester THEN score END) ClassSTDeviation, (SELECT DecTile FROM cteNtile WHERE instructorID = @instructorID)*10 DecTile, X.DepartmentClassFiveYearAverage AS DepartmentClassFiveYearAverage, X.DepartmentClassFiveYearSTDeviation AS DepartmentClassFiveYearSTDeviation, X.InstructorClassFiveYearAverage AS InstructorClassFiveYearAverage, X.InstructorClassFiveYearSTDeviation AS InstructorClassFiveYearSTDeviation FROM cteMain Q CROSS JOIN cteFiveYear X
这将防止的多次执行(有关实际执行计划,请参见Number of Executions属性)cteFiveYear。
Number of Executions
cteFiveYear
示例:如果执行此查询
SELECT h.ProductID,h.StandardCost, x.AvgPrice FROM Production.ProductCostHistory h CROSS JOIN ( SELECT AVG(p.ListPrice) AvgPrice FROM Production.Product p ) x
使用AdventureWorks2008R2数据库,那么实际的执行计划将是
AdventureWorks2008R2