将多个 CTE 与多个临时表一起使用

Posted

技术标签:

【中文标题】将多个 CTE 与多个临时表一起使用【英文标题】:Using multiple CTE with multiple temp tables 【发布时间】:2021-11-26 18:58:56 【问题描述】:

在 Windows Server 中,我尝试使用多个 CTE 收集数据,并将它们插入到几个临时表中,以便稍后执行连接。下面是我得到的。 :

------TEMP TABLE SET UP------
IF EXISTS   (
           SELECT *
           FROM tempdb.dbo.sysobjects
           WHERE id = Object_id(N'tempdb..#LEFT')
           )
       BEGIN
           DROP TABLE #LEFT
       END
IF EXISTS   (
           SELECT *
           FROM tempdb.dbo.sysobjects
           WHERE id = Object_id(N'tempdb..#RIGHT')
           )
       BEGIN
           DROP TABLE #RIGHT
       END
------TEMP TABLE SET UP END------
------CTE SET UP------
; with 
 CTEfirst (1a, b, c, d) as 
 (select 1a, b, c, d from tableA)
, CTEone (a, b, c) as
 (select a, b, c from table1)
),
 CTEtwo (a, b, c) as (
 (select a, b, c from table2)
),
   CTEthree (a, b, c) as (
 (select a, b, c from table3)
------CTE SET UP END------
select * into #LEFT from CTEone 
union
select * from CTEtwo 
union
select * from CTEthree 
-----------------------------
/*At this point I am getting the issue to recognize CTEfirst when attempting to insert data into #RIGHT temp table unless I move the below portion below the previous section (prior to the unions) but then would encounter the issue of the overall query not recognizing the next CTE, CTEone.*/
select * into #RIGHT from CTEfirst

谢谢

【问题讨论】:

也标记您的数据库。你在用sql server吗? 你还没有定义“CTEfirst” 根据 CTE 的规范,在 CTE 之后只能有一个选择(UNION ALL 是第一个选择的延续)。 select * into #RIGHT from CTEfirst 是不支持的第二条语句。事实上,如果你运行它,你会得到一个 Invalid object name 'CTEfirst'. 错误。根据规范:CTE 后面必须跟一个 SELECT 语句。不支持 INSERT、UPDATE、DELETE 和 MERGE 语句。 docs.microsoft.com/en-us/sql/t-sql/queries/… 谢谢 jjthebig1 这是我害怕但不确定的。您的发现似乎已经回答了这个问题。 【参考方案1】:

你已经声明了 cte 但它是空的

; with 
CTEfirst (a, b, c, d)
as ( select ...) --<-- missing cte definiation here 
, CTEone (a, b, c) as
 (select a, b, c from table1)
),

【讨论】:

我已经更正了原始帖子,是的,它在 Windows 服务器环境中运行。【参考方案2】:

您不能为多个未附加的选择语句引用同一个 CTE。 当您插入#left 时,您的第一个查询结束。 之后,您将无法运行引用相同(未附加)CTE 的新选择语句。 将 CTE 视为重新格式化的子查询。如果您希望将数据加载到多个临时表中,我一开始不会使用 CTE。直接插入临时表即可。

【讨论】:

以上是关于将多个 CTE 与多个临时表一起使用的主要内容,如果未能解决你的问题,请参考以下文章

在某些情况下,为什么CTE(公用表表达式)与SQL Server中的临时表相比会减慢查询速度

将 with cte 查询的结果插入临时表

哪个性能更高,CTE 或临时表?

CTE内部有多个子查询

分享一个 HIVE SQL 性能优化点-使用公共表表达式 CTE 替换临时表

CTE、子查询、临时表或表变量之间是不是存在性能差异?