2011-07-13 14 views
5

Mam kilka sprawozdań tak (że stosowanie z oświadczeniem):SQL Server: Łączenie kilku SELECT z „z” części do unii

WITH valDiff AS (SELECT <ComplexClause1> AS v1 FROM [MyTable] WHERE <OtherClause1>) SELECT SUM(CASE WHEN v1 < @MaxVal THEN v1 ELSE @MaxVal END) FROM valDiff 

UNION 

WITH valDiff AS (SELECT <ComplexClauseN> AS v1 FROM [MyTable] WHERE <OtherClauseN>) SELECT SUM(CASE WHEN v1 < @MaxVal THEN v1 ELSE @MaxVal END) FROM valDiff 

muszę włączać je do Unii, tak aby wynik jest zwracany "za jednym zamachem". Oświadczenia te działają dobrze przez siebie, ale jeśli dodać słowo „związku” między nimi, jak pokazałem powyżej, pojawia się następujący błąd:

Incorrect syntax near the keyword 'UNION'.
Incorrect syntax near the keyword 'with'.
If this statement is a common table expression, an xmlnamespaces clause or a change tracking context clause, the previous statement must be terminated with a semicolon."

Co robię źle?

Odpowiedz

8

WITH obejmie wszystkie klauzule w Unii

;WITH valDiff AS 
(
whatever 
) 
SELECT ... FROM valDiff ... 
UNION ALL 
SELECT ... FROM valDiff ... 

Z innej CTE w każdym punkcie (jak w tym przypadku):

;WITH CTE1 AS 
(
whatever 
) , CTE2 AS 
(
something 
) 
SELECT ... FROM CTE1 ... 
UNION ALL 
SELECT ... FROM CTE2 ... 
1

Przegrupuj składnię nieco tak, że cała Współczynniki CTE są najważniejsze:

WITH valDiff1 AS (SELECT <ComplexClause1> AS v1 FROM [MyTable] WHERE <OtherClause1>), 
    valDiff2 AS (SELECT <ComplexClauseN> AS v1 FROM [MyTable] WHERE <OtherClauseN>) 
SELECT SUM(CASE WHEN v1 < @MaxVal THEN v1 ELSE @MaxVal END) FROM valDiff1 
UNION ALL 
SELECT SUM(CASE WHEN v1 < @MaxVal THEN v1 ELSE @MaxVal END) FROM valDiff2 
Powiązane problemy