Pr0*_*r0n 7 sql t-sql sql-server
我有一个相当复杂的查询,有多个CTE,但有一个主要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
Run Code Online (Sandbox Code Playgroud)
这将防止 的多次执行(有关实际执行计划,请参阅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
Run Code Online (Sandbox Code Playgroud)
使用AdventureWorks2008R2数据库那么实际的执行计划将是
