Mam dość skomplikowane zapytanie z wieloma CTE, ale 1 główny CTE, z którego inni czerpią, czy to powoduje, że główny CTE ma być wykonywany wiele razy?Wywołanie CTE wiele razy w tym samym zapytaniu
5
A
Odpowiedz
2
można użyć CROSS JOIN sposób:
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
Pozwoli to uniknąć wielu egzekucji (do rzeczywistego planu wykonania widzieć Number of Executions
własności) dla cteFiveYear
.
Przykład: Jeśli wykonanie tej kwerendy
SELECT h.ProductID,h.StandardCost,
x.AvgPrice
FROM Production.ProductCostHistory h
CROSS JOIN (
SELECT AVG(p.ListPrice) AvgPrice
FROM Production.Product p
) x
korzystając AdventureWorks2008R2
bazę następnie rzeczywisty plan wykonania będzie
1
Zapraszamy do obejrzenia poniższej
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
a następnie w tym SQL Fiddle DEMO
można zauważyć od planu wykonania, że sekcja Vals CTE jest wykonywany dwukrotnie.
Może także rzucić okiem na How many times the T-SQL inside the CTE is executed?
Powiązane problemy
- 1. Użyj jednego CTE wiele razy
- 2. Jak mogę odwołać się do pojedynczej tabeli wiele razy w tym samym zapytaniu?
- 3. Średnia dla liczby() w tym samym zapytaniu
- 4. podzielić dwa razy w tym samym wyrażeniu?
- 5. Czy zmiana wielu kolumn w tym samym zapytaniu jest szybsza?
- 6. Jak zliczyć wiele kluczy w tym samym zapytaniu grupy agregacji MongoDB $?
- 7. Wiele UIAlertViews w tym samym widoku
- 8. Jak wybrać max, min w tym samym zapytaniu w slick
- 9. ReactJS, Wywołanie setState z tym samym parametrem
- 10. Jak zaznaczyć wszystkie kolumny i count (*) w tym samym zapytaniu
- 11. Jak dodać wyniki dwóch wybranych poleceń w tym samym zapytaniu
- 12. Jak wybrać wiele pól w tym samym rzędzie? (MySQL)
- 13. Czy można wykonać wiele instrukcji SQL w jednym zapytaniu? Oba SELECT będzie na tym samym stole
- 14. To samo pod-zapytanie używane wiele razy w pojedynczym zapytaniu
- 15. Statyczny konstruktor jest wywoływany dwa razy w tym samym appdomain?
- 16. Wiele-do-wielu na tym samym stole
- 17. Czy można bezpiecznie wywołać inicjalizatory wiele razy na tym samym obiekcie 'alloc'ed?
- 18. Wiele klas relacji z tym samym typem
- 19. Perl, dopasuj jeden wzór wiele razy w tym samym wierszu rozdzielonym nieznanymi znakami
- 20. Wiele skojarzeń z tym samym modelem w CakePHP 3
- 21. TCPDF dwa razy wolniej niż FPDF z tym samym kodem
- 22. wiele wątków mogących uzyskać stado w tym samym czasie
- 23. Jak złapać wiele wyjątków w tym samym czasie w Kotlin
- 24. Wiele sesji i wykresów w Tensorflow (w tym samym procesie)
- 25. Wiele interpreterów w języku Python używanych w tym samym projekcie?
- 26. Złap wiele wyjątków w tym samym czasie w VB.NET
- 27. wiele języków w tym samym projekcie w IntelliL pomysł
- 28. NSNotificationCenter dzwoni wiele razy
- 29. CTE w ramach CTE
- 30. Jak wstawić wiele rekordów do tabeli w tym samym czasie?
Dzięki google na trochę, ale nie mógł znaleźć coś rozstrzygające, chyba do tego trzeba użyć tabel tymczasowych, ponieważ jest powolny jak melasa. – Preston
@Preston, zanim zaczniesz korzystać z tabel tymczasowych, polecam przejrzenie planu wykonania dla zapytania i ustalenie, czy strategia indeksu poprawi wydajność zapytań. – zedfoxus
@zfus Niestety nie jest to moja baza danych, to w rzeczywistości główna baza testowa na mojej uczelni i chociaż nie mają nic przeciwko umieszczaniu mojego zapytania w zapisanym proc, nie zrobią dla mnie innych zmian. – Preston