SQL Server中CTE内部的CTE

时间:2014-04-10 13:34:18

标签: sql sql-server sql-server-2008 tsql

请不要将此问题标记为CTE within a 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

;WITH CTE1 AS (
   Select * From (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))

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

4 个答案:

答案 0 :(得分: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   ...

答案 1 :(得分:3)

将您的CTE与,分开,而不是将它们嵌套。

;
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
;

然而,你必须非常小心并发;两个并发用户尝试使用相同的名称创建相同的视图。

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

答案 2 :(得分:0)

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

我想这就是你要做的事。

答案 3 :(得分:0)

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

WITH CTE AS
(   SELECT  *
    FROM    OPENQUERY([Your Server], 'Query Provide by Other System')
) 
SELECT  *
FROM    CTE; 

您可能需要配置服务器以进行数据访问:

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