2013-08-07 10 views

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

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?

+0

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

+2

@Preston, zanim zaczniesz korzystać z tabel tymczasowych, polecam przejrzenie planu wykonania dla zapytania i ustalenie, czy strategia indeksu poprawi wydajność zapytań. – zedfoxus

+0

@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

Powiązane problemy