我有一個相當複雜的多個CTE查詢,但有一個主要的CTE,其他人都從中拉出,這是否會導致主CTE被多次執行?在同一查詢中多次調用CTE
5
A
回答
2
你可以使用CROSS JOIN這樣的:爲cteFiveYear
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 [email protected] AND Q.year = @year AND semester = @semester THEN score END) ClassScore,
STDEVP(CASE WHEN [email protected] 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
屬性)。
例如:如果您使用執行數據庫AdventureWorks2008R2
此查詢
SELECT h.ProductID,h.StandardCost,
x.AvgPrice
FROM Production.ProductCostHistory h
CROSS JOIN (
SELECT AVG(p.ListPrice) AvgPrice
FROM Production.Product p
) x
那麼實際執行計劃將
1
看一看下面
DECLARE @Table TABLE(
ID INT,
Val VARCHAR(50),
TypeID INT
)
DECLARE @TableTypes TABLE(
TypeID INT,
TypeName VARCHAR(50)
)
;WITh Vals AS (
SELECT *
FROm @Table
WHERE ID > 10
)
, UsingVals1 AS (
SELECT v.*,
tt.TypeName
FROm Vals v INNER JOIN
@TableTypes tt ON v.TypeID = tt.TypeID
)
, UsingVals2 AS (
SELECT v.*,
tt.TypeName
FROm Vals v INNER JOIN
@TableTypes tt ON v.TypeID = tt.TypeID
WHERE tt.TypeName LIKE '%%'
)
SELECT *
FROM UsingVals1
UNION
SELECT *
FROM UsingVals2
,接着在SQL Fiddle DEMO
你會從該丘壑CTE部分執行兩次執行計劃通知。
相關問題
- 1. 多次使用一個CTE
- 2. T-SQL:多次使用CTE別名 - 不僅在外部查詢
- 3. 在CTE查詢
- 4. 在單個查詢中多次使用相同的子查詢
- 5. 避免在查詢中多次使用相同的子查詢
- 6. 能否在Oracle中的查詢中引用兩次CTE?
- 7. 在查詢中包含CTE
- 8. 在一次調用中執行多個mysql查詢
- 9. 貓鼬:在一次調用中填充多個查詢
- 10. IBatis如何在一次調用中執行多個查詢
- 11. PostgreSQL:在一個查詢中多次調用相同函數的最佳方法?
- 12. 相同(子)查詢多次在一個MySQL查詢
- 13. 如何在同一查詢中多次引用TEMPORARY表?
- 14. LINQ to SQL多次查詢同一列
- 15. 單個查詢中的多個CTE
- 16. mySQL查詢 - 在同一個查詢中再次使用結果
- 17. 如何使用CTE表多於一次
- 18. 從CTE查詢
- 19. 在Visual Studio 3中使用CTE查詢
- 20. CTE執行多次
- 21. 在另一個CTE中調用一個CTE
- 22. 同一查詢中不同表格上的多次計數
- 23. 在同一個查詢中雄辯地多次選擇
- 24. 同一列在查詢中多次出現
- 25. CodeIgniter在同一個查詢中多次更新
- 26. 在SQLAlchemy中多次查詢同一個表
- 27. 在查詢中多次更新同一列
- 28. 在同一查詢中多次連接表?
- 29. 如何避免在查詢中多次加入同一個表?
- 30. 如何在SQL Server中使用CTE執行多個查詢?
謝謝,我用Google搜索一下,但找不到任何確鑿,我想我因爲它像糖蜜一樣慢,所以必須使用臨時表。 – Preston
@Preston,在開始使用臨時表之前,我建議查看執行計劃以確定查詢並確定索引策略是否會提高查詢性能 – zedfoxus
@zfus不幸的是,這不是我的數據庫,它實際上是我大學的主要測試數據庫雖然他們不介意將我的查詢放在存儲過程中,但他們不會爲我做其他更改。 – Preston