无法从多个公用表表达式(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 语句会运行,即第一个。不管哪个是哪个,只运行第一个。我认为这是我可能缺少的某种语法?我收到错误“无效的对象名称'temp2'”。
有人能解释一下这个问题吗?有什么解决方法吗?
【问题讨论】:
【参考方案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)中多次查询?的主要内容,如果未能解决你的问题,请参考以下文章