如何在多个CTE中使用UNION操作?

77

如何在多个公共表达式中使用UNION

我正在尝试汇总一些数据,但无论我在哪里放置;,都会出现错误。

SELECT  COUNT(*)
FROM    dbo.Decision_Data
UNION
SELECT  COUNT(DISTINCT Client_No)
FROM    dbo.Decision_Data
UNION
WITH    [Clients]
          AS ( SELECT   Client_No
               FROM     dbo.Decision_Data
               GROUP BY Client_No
               HAVING   COUNT(*) = 1
             )
    SELECT  COUNT(*) AS [Clients Single Record CTE]
    FROM    Clients;

我很感激上面的例子中我可以将单个CTE移动到开头,但我有很多CTE我想要UNION

2个回答

131

如果您想要联接多个CTE,则需要先声明这些CTE,然后使用它们:

With Clients As
    (
    Select Client_No
    From dbo.Decision_Data
    Group By Client_No
    Having Count(*) = 1
    )
    , CTE2 As
    (
    Select Client_No
    From dbo.Decision_Data
    Group By Client_No
    Having Count(*) = 2
    )
Select Count(*)
From Decision_Data
Union
Select Count(Distinct Client_No)
From dbo.Decision_Data
Union
Select Count(*)
From Clients
Union
Select Count(*)
From CTE2;
你甚至可以使用一个CTE从另一个CTE中获取数据:
With Clients As
        (
        Select Client_No
        From dbo.Decision_Data
        Group By Client_No
        Having Count(*) = 1
        )
        , CTE2FromClients As
        (
        Select Client_No
        From Clients
        )
    Select Count(*)
    From Decision_Data
    Union
    Select Count(Distinct Client_No)
    From dbo.Decision_Data
    Union
    Select Count(*)
    From Clients
    Union
    Select Count(*)
    From CTE2FromClients;

使用公共表达式的 WITH 子句 (Transact-SQL)


我的错...我想要将多个CTE联合起来。 - SteveC
2
@SteveC - 简而言之,您需要先声明您想在最终表达式中使用的所有CTE,然后在联合查询中使用它们。 - Thomas
1
谢谢。使用逗号来声明多个CTE是我所缺少的。 - Dan Walters

17

你可以像这样做:

WITH    [Clients]
          AS ( SELECT   Client_No
               FROM     dbo.Decision_Data
               GROUP BY Client_No
               HAVING   COUNT(*) = 1
             ),
        [Clients2]
          AS ( SELECT   Client_No
               FROM     dbo.Decision_Data
               GROUP BY Client_No
               HAVING   COUNT(*) = 1
             )
SELECT  COUNT(*)
FROM    Clients
UNION
SELECT  COUNT(*)
FROM    Clients2;

我的错...我想要将多个CTE联合起来。 - SteveC
这样做不起作用,因为您在声明Clients2 CTE之后使用了Clients CTE。它超出了参考范围。 - AnandPhadke
1
@AnandPhadke - 这个可以正常工作,我不明白你为什么说它不能工作。 - DaveShaw
@DaveShaw -- 是的,我在考虑在CTE之间添加一些选择语句。如果我们在CTE之间有任何SQL语句,那么它将无法工作。但是在这种情况下,它会起作用。 - AnandPhadke
你在编写代码时使用了什么工具或扩展来进行格式化吗?我很喜欢这种格式,之前还没有见过。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接