2011-07-13 22 views
5

tengo varias de las declaraciones como esta (que uso con la declaración):SQL Server: combinar varias instrucciones SELECT con "CON" parte en una unión

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 

que necesito para incorporarlos en una unión de manera que el resultado se devuelve "de una sola vez". Esas declaraciones funcionan bien por sí mismos, pero si añado la palabra "unión" entre ellos, como he mostrado antes, me sale el siguiente error:

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."

¿Qué estoy haciendo mal?

Respuesta

8

El CON abarcará todas las cláusulas en la Unión

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

Con una diferente CTE en cada cláusula (como en este caso):

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

reorganizar su sintaxis un poco para que todo el Los CTE son los primeros:

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 
Cuestiones relacionadas