将多个 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中的临时表相比会减慢查询速度