Sql 如何使用cte?

Sql 如何使用cte?,sql,sql-server,Sql,Sql Server,我有一个简单的cte结构,如: ;WITH Base_cte AS ( SELECT FROM WHERE ) SELECT FROM ( SELECT FROM Base_cte WHERE ) SELECT FROM Base_cte WHERE 第二次使用cte选择时返回: 无效的对象名称“Base_cte” 我不知道为什么它不能第二次识别cte。代码太大,无法粘

我有一个简单的cte结构,如:

;WITH Base_cte AS 
    (
        SELECT
        FROM
        WHERE
    )

SELECT
FROM
   (
       SELECT
       FROM Base_cte
       WHERE
    )

SELECT
FROM Base_cte
WHERE
第二次使用cte选择时返回:

无效的对象名称“Base_cte”

我不知道为什么它不能第二次识别cte。代码太大,无法粘贴到这里,但基本上相当简单,我想我肯定遗漏了一些基本的东西。
任何提示都将不胜感激。

您需要使用此格式

;WITH Base_cte AS 
    (
        SELECT
        FROM
        WHERE
    )
,CTE1 AS
(
       SELECT
       FROM Base_cte
       WHERE
)
SELECT * FROM CTE1

您需要使用这种格式

;WITH Base_cte AS 
    (
        SELECT
        FROM
        WHERE
    )
,CTE1 AS
(
       SELECT
       FROM Base_cte
       WHERE
)
SELECT * FROM CTE1

您需要第二台CTE吗?为什么不:

;with base_cte as
(
    select
    from
    where
)

select *
from base_cte
join
where

您需要第二台CTE吗?为什么不:

;with base_cte as
(
    select
    from
    where
)

select *
from base_cte
join
where

您只能在紧接着CTE定义的select中使用CTE。例如,如果要在其他查询中使用它,第一个查询可以将数据插入临时表。将第二个select语句包装到其他CTECommon表表达式只是它们所在语句的一部分。第二个查询在逻辑上是一个新语句,其中未定义
Base\u cte
。顺便说一下,混合使用CTE和子查询看起来很笨拙:您可以使用X作为(…),Y作为(…从X),Z作为(…从Y)选择。。。相反,从Z开始,在进行过程中建立查询。在这种情况下,使用TESTERABLE而不是CTE不是更好吗?使用临时表还是CTE在很大程度上取决于查询的性能特征和中间结果的大小。有时临时表更好,有时CTE更好。您只能在紧接着CTE定义的select中使用CTE。例如,如果要在其他查询中使用它,第一个查询可以将数据插入临时表。将第二个select语句包装到其他CTECommon表表达式只是它们所在语句的一部分。第二个查询在逻辑上是一个新语句,其中未定义
Base\u cte
。顺便说一下,混合使用CTE和子查询看起来很笨拙:您可以使用X作为(…),Y作为(…从X),Z作为(…从Y)选择。。。相反,从Z开始,在进行过程中建立查询。在这种情况下,使用TESTERABLE而不是CTE不是更好吗?使用临时表还是CTE在很大程度上取决于查询的性能特征和中间结果的大小。有时临时表更好,有时CTE更好。