Ho una query abbastanza complicata con più CTE ma 1 CTE principale da cui tutti gli altri provengono, ciò fa sì che il CTE principale venga eseguito più volte?Chiamare CTE più volte nella stessa query
5
A
risposta
2
Si potrebbe utilizzare CROSS JOIN così:
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
Questo consentirà di evitare esecuzioni multiple (per il piano di esecuzione effettivo vedere Number of Executions
proprietà) per cteFiveYear
.
Esempio: Se si esegue questa query
SELECT h.ProductID,h.StandardCost,
x.AvgPrice
FROM Production.ProductCostHistory h
CROSS JOIN (
SELECT AVG(p.ListPrice) AvgPrice
FROM Production.Product p
) x
utilizzando AdventureWorks2008R2
banca dati poi il piano di esecuzione effettivo sarà
1
Date un'occhiata al di sotto
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
E allora a questo SQL Fiddle DEMO
Noterete dal piano di esecuzione che la sezione Vals CTE viene eseguito due volte.
magari avere anche uno sguardo al How many times the T-SQL inside the CTE is executed?
Problemi correlati
- 1. Utilizzare un CTE più volte
- 2. Stessa query secondaria utilizzata più volte in una singola query
- 3. Non è possibile utilizzare il gruppo più e più volte (partition by) nella stessa query?
- 4. È più veloce modificare più colonne nella stessa query?
- 5. Come posso fare riferimento a una singola tabella più volte nella stessa query?
- 6. Postgres Regole Prevenzione CTE query
- 7. Riutilizzo della stessa pagina più volte
- 8. semplificare SQL utilizzando CTE
- 9. query iterativa senza utilizzare CTE
- 10. Mantenerlo semplice e come eseguire più CTE in una query
- 11. Più UIAlertViews nella stessa vista
- 12. più caricatori nella stessa attività
- 13. più chartjs nella stessa pagina
- 14. sql seleziona query nella stessa tabella
- 15. Media su un conteggio() nella stessa query
- 16. Come seleziono più valori nella stessa colonna?
- 17. Utilizzo di MAX() e COUNT() nella stessa query
- 18. Come fare riferimento a un CTE due volte?
- 19. La query di framework Entity restituisce la stessa riga più volte
- 20. È meglio riutilizzare SqlCommand quando si esegue la stessa query SQL più volte?
- 21. Esegui script Greasemonkey sulla stessa pagina, più volte?
- 22. aggiungendo la stessa chiave due volte nella Mappa
- 23. Definizione dell'interfaccia più volte nella classe ereditata
- 24. Caricamento di più file nella stessa richiesta
- 25. Più versioni PHP nella stessa casella
- 26. Più versioni di JQuery nella stessa pagina
- 27. Tracciare più immagini nella stessa trama
- 28. più secchi S3 nella stessa distribuzione CloudFront
- 29. WebRTC più stream video nella stessa peerConnection
- 30. Più grafici nella stessa figura [R]
Grazie Googled per un po ', ma non riusciva a trovare nulla di conclusivo, credo che Dovrò usare le tabelle temporanee per questo dato che è lento come melassa. – Preston
@Preston, prima di iniziare a utilizzare le tabelle temporanee, consiglierei di esaminare il piano di esecuzione per la query e determinare se una strategia di indicizzazione migliorerà le prestazioni delle query – zedfoxus
@zfus Sfortunatamente non è il mio database, in realtà è il database di test principale della mia università e mentre loro non si occupano di mettere la mia domanda in un processo memorizzato, non faranno altri cambiamenti per me. – Preston