2013-08-07 20 views

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à enter image description here

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?

+0

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

+2

@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

+0

@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

Problemi correlati