2011-07-13 11 views
5

Ben böyle ifadeleri (deyimi İLE kullanan) birkaç:SQL Server: Bir UNION içine parçası "İLE" ile birkaç SEÇ ifadeleri birleştirin

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 

ben böylece birlik içine dahil etmeye gerek sonuç "bir swoop" olarak döndürülür. Yanlış

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

yapıyorum: Aralarında kelime "BİRLİĞİ" eklerseniz yukarıda gösterdiğim gibi olanlar ifadeleri aşağıdaki hatayı olsun, başlarına iyi çalışır, ancak?

cevap

8

İLE (bu durumda olduğu gibi) her maddede farklı bir CTE ile BİRLİĞİ

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

tüm maddelerini span:

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

biraz sizin sözdizimi yeniden düzenleme, böylece tüm CTE'ler önce gelir:

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