无法从多个公用表表达式(WITH)中多次查询?

Posted

技术标签:

【中文标题】无法从多个公用表表达式(WITH)中多次查询?【英文标题】:Not Able to Query Multiple Times from Multiple Common Table Expressions (WITH)? 【发布时间】:2012-03-16 19:55:46 【问题描述】:

我今天在 T-SQL、SQL-Server-2008 中进行一些查询,偶然发现了一些我不理解的奇怪东西。使用查询窗口,我试图从两个常见的表表达式中进行查询(我删除了很多代码以使其更明显我在做什么):

;WITH temp1 AS (SELECT * FROM dbo.Log)
, temp2 AS (SELECT  * FROM dbo.SignalCodeItems300_tbl)

SELECT * FROM temp1
SELECT * FROM temp2

但是,只有一个 select 语句会运行,即第一个。不管哪个是哪个,只运行第一个。我认为这是我可能缺少的某种语法?我收到错误“无效的对象名称't​​emp2'”。

有人能解释一下这个问题吗?有什么解决方法吗?

【问题讨论】:

【参考方案1】:

不,这可以正常工作。 CTE(公用表表达式)仅可用于定义后的第一条语句。所以换句话说,在select * from temp1之后,它们都变得不可用了。

解决办法是这样的:

;WITH temp1 AS (SELECT * FROM dbo.Log)
SELECT * FROM temp1

;WITH temp2 AS (SELECT  * FROM dbo.SignalCodeItems300_tbl)
SELECT * FROM temp2

【讨论】:

【参考方案2】:

您可能想看看MSDN documentation。

特别是:

Multiple CTE query definitions can be defined in a nonrecursive CTE. 
The definitions must be combined by one of these set operators:
UNION ALL, UNION, INTERSECT, or EXCEPT.

但是,您不能混合和匹配两种不同的模式,因为这本质上是作为一个查询运行的。

【讨论】:

【参考方案3】:

如果您不想明确重复查询,请使用视图或用户定义的表值函数来容纳查询。

【讨论】:

以上是关于无法从多个公用表表达式(WITH)中多次查询?的主要内容,如果未能解决你的问题,请参考以下文章

SQL With (递归CTE查询)

SQL-CTE公用表达式

[sql]with..as表达式递归查询

SQL递归查询知多少

无法在多个公用表表达式中绑定标识符

mysql8 公用表表达式CTE的使用