SQL Server中的CTE内嵌CTE

3
请不要将这个问题标记为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))

请帮助我处理这个问题,我猜我的需求太过动态了。


2
为什么不直接使用 With CTE2 as ( Select * from #Temp), CTE1 AS (SELECT * FROM CTE2) SELECT * FROM CTE1;,而不需要嵌套它们呢? - GarethD
链接的答案似乎完全回答了你的问题。也许你不完全理解什么是CTE?它只是一个内联视图,没有更多的东西。 - usr
抱歉,实际上就像我说的一样,我对内部查询没有任何控制权...而且内部查询可能是CTE查询,也可能不是...这只是一个返回值集合(表值)的查询,并且这个查询由其他系统提供...所以我不知道它长什么样子... - kombsh
你怎么知道查询语句是否能够成功解析?或者引用有效的表格?如果你不知道查询语句包含哪些列,或者它是一个公共表达式,或者其中有什么数据类型,那么你打算如何引用这个查询语句的输出结果到其他系统中呢?你的问题似乎比仅仅嵌套公共表达式要深层次得多! - GarethD
嗨 @GarethD,根据我的需求,我不关心查询返回什么类型的列...在这里,我只会把它视为返回一组行...我的任务是在返回结果中进行分页,然后只取所需的行.. - kombsh
https://learnsql.com/blog/sql-recursive-cte/ - Billu
4个回答

8

仅供参考:

;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
抱歉,实际上就像我说的一样,我对内部查询没有任何控制权...而且内部查询可能是CTE查询,也可能不是...这只是一个返回值集合(表值)的查询... - kombsh

6

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

但是,你必须非常小心并发问题:两个并发用户试图使用相同名称创建相同视图。

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


谢谢您的回答...所以没有临时/动态视图吗?比如单个连接的临时表? - kombsh
我无法创建这样的视图。 - kombsh

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

我猜这就是你想要做的事情。


0

如果您的系统生成的查询使用了数据库限定对象名称,您可以通过使用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;

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