SQL Server中CTE内部的CTE

kom*_*bsh 2 sql t-sql sql-server sql-server-2008

请不要在CTE中将此问题标记为CTE的副本.我检查了该问题和答案......但该答案不能满足我的需要.

我想像这样运行嵌套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
Run Code Online (Sandbox Code Playgroud)

要么

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

Select * from CTE1
Run Code Online (Sandbox Code Playgroud)

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

请想象一下

;WITH CTE1 AS (
       "Query Provide by Other System"
    )
Run Code Online (Sandbox Code Playgroud)

在某些情况下,"查询由其他系统提供"从CTE开始......这可能是也可能不是CTE查询...这是我无法使用的确切问题,如下所示

;WITH CTE1 AS (
   Select * From 
)
,With CTE2 as
 ( Select * from #Temp))
Run Code Online (Sandbox Code Playgroud)

请帮助任何人修改这个,我想我的需求太过动态了

Mih*_*riu 5

只是想一个主意:

;WITH cte1 AS
(
    SELECT * FROM ...
),
cte2 as
(
    SELECT * FROM ...
),
cte3 as
(
    SELECT * FROM ... INNER JOIN cte2 ON...
),
SELECT *
FROM
    cte1
    INNER JOIN cte3 ON   ...
Run Code Online (Sandbox Code Playgroud)


Mat*_*lie 5

,s分隔你的 CTE而不是嵌套它们。

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

SELECT
  *
FROM
  CTE1
Run Code Online (Sandbox Code Playgroud)


编辑:按照您的其他评论

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

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

一种选择可能是使用真实想法。

CREATE VIEW xxx AS
  <system generated code here>
;

SELECT
  *
FROM
  xxx
;
Run Code Online (Sandbox Code Playgroud)

但是,您必须非常小心并发性;两个并发用户尝试使用相同的名称创建相同的视图。

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