SQL Server中CTE内部的CTE

SQL Server中CTE内部的CTE,sql,sql-server,sql-server-2008,tsql,Sql,Sql Server,Sql Server 2008,Tsql,请不要把这个问题标为重复的。。我检查了那个问题和答案。。。但这个答案不能满足我的需要 我想像这样运行嵌套的CTE查询 Drop Table #Temp Create Table #Temp(name1 text, name2 text) Insert INTO #Temp Values ('test','test') Insert INTO #Temp Values ('test','test') ;WITH CTE1 AS ( With CTE2 as ( Select * from

请不要把这个问题标为重复的。。我检查了那个问题和答案。。。但这个答案不能满足我的需要

我想像这样运行嵌套的CTE查询

Drop Table #Temp
Create Table #Temp(name1 text, name2 text)

Insert INTO #Temp Values ('test','test')
Insert INTO #Temp Values ('test','test')

;WITH CTE1 AS (
   With CTE2 as ( Select * from #Temp)
)

Select * from CTE1

在我们的结构中。。。内部CTE2查询已由其他系统提供。。所以我无法控制 查询的内部部分。。。所以这里我的职责只是从内部查询中选择值,并在我的系统中形成新的CTE

请想象一下

;WITH CTE1 AS (
       "Query Provide by Other System"
    )
在某些情况下,其他系统提供的查询以CTE开头。这可能是也可能不是CTE查询。。。这正是问题所在,因为我不能像下面这样使用

;WITH CTE1 AS (
   Select * From 
)
,With CTE2 as
 ( Select * from #Temp))

请帮助任何人解决这个问题,我想我的需求太过动态了,以至于我没有一个想法:

;WITH cte1 AS
(
    SELECT * FROM ...
),
cte2 as
(
    SELECT * FROM ...
),
cte3 as
(
    SELECT * FROM ... INNER JOIN cte2 ON...
),
SELECT *
FROM
    cte1
    INNER JOIN cte3 ON   ...
将CTE与s分开,而不是嵌套它们

;
WITH
  CTE2 AS
(
  SELECT * FROM #Temp
)
,
  CTE1 AS
(
  SELECT * FROM CTE2
)

SELECT
  *
FROM
  CTE1
编辑:跟随您的附加评论

据我所知,系统向您提供了一个系统生成的查询,然后您希望将其嵌入到另一个查询中。有时系统生成的查询使用CTE,有时不使用;您事先不知道该查询的格式

不幸的是,这意味着您不能将其嵌入另一个CTE中

一种选择是使用真实视图

CREATE VIEW xxx AS
  <system generated code here>
;

SELECT
  *
FROM
  xxx
;
然而,您必须非常小心并发性;两个并发用户试图创建具有相同名称的相同视图

更好的解决方案是与系统的供应商联系,让他们创建系统生成的查询,并询问他们建议您如何使用它

;with BASE AS (
    SELECT * FROM table1
), BASE2 AS (
   SELECT * from table2
), BASE3 AS (
    SELECT * FROM table3
) SELECT * FROM BASE INNER JOIN BASE3 ...

我想这就是您要做的。

如果您的系统生成的查询使用db限定对象名,您可以使用OPENQUERY来破解此问题:

您可能需要为数据访问配置服务器:

EXEC sp_serveroption 'your server', 'DATA ACCESS', TRUE;

为什么不使用CTE2作为Select*from Temp,CTE1作为Select*from CTE2 Select*from CTE1;,你不需要嵌套它们。链接的答案似乎正好回答了你的问题。也许你不完全明白什么是CTE?这是一个内联视图,仅此而已。抱歉,实际上正如我所说,我对内部查询没有任何控制权…内部查询可能是也可能不是CTE查询…这只是一个查询返回一组valuestable值,此查询由其他系统提供。。所以我不知道。。它看起来怎么样..你怎么知道查询会被解析呢?还是将引用有效的表?若您不知道查询包含哪些列,或者它是否是CTE,或者将有哪些数据类型,那个么您打算如何引用来自其他系统的查询输出?您的问题似乎比嵌套CTE更为根深蒂固!您好@GarethD,在我的需要中,我不关心查询返回什么样的列。。。这里我将考虑它返回一组行…我的职责是在返回的结果中进行分页,然后只需要所需的行…抱歉,实际上,正如我所说的,我无法控制内部查询…内部查询可能是CTE查询,也可能不是CTE查询…这是一个查询,只返回一组valuestable值…感谢您的回答…所以没有临时/动态视图?像单个连接的临时表吗?我不能创建这样的视图
WITH CTE AS
(   SELECT  *
    FROM    OPENQUERY([Your Server], 'Query Provide by Other System')
) 
SELECT  *
FROM    CTE; 
EXEC sp_serveroption 'your server', 'DATA ACCESS', TRUE;