TSQL - CTE/#Temp Table



在 SSMS 2016 中,我创建了一个 CTE,然后在语句之后立即从 CTE 中删除了一些行。

WITH cte AS 
(
   SELECT [GroupID], [UserID]+0.5, [Value] from dbo.myTable
)
DELETE FROM cte WHERE concat(GroupID, UserID) in (select concat(GroupID, UserID) as Concat from cte group by GroupID)

但是,我想将剩余的行INSERT到现有表中,但是当我尝试时,我收到以下错误:"Invalid object name 'cte'.">

我怀疑这个问题与 CTE 的工作方式有关。由于我对他们相当陌生,我不确定,但似乎 CTE 只能在WITH AS之后立即引用一次?这是真的吗?有没有办法解决这个问题?如何插入来自 CTE 的数据?

我正在考虑以某种方式使用临时表,但我不知道是否真的有区别。

CTE是一个完成的。你对它们运行一个查询,然后它们就消失了。您可以改用临时表,该表将在会话期间持续存在。

SELECT [GroupID], [UserID], [Value] 
INTO #temp 
from dbo.myTable
DELETE FROM #temp 
WHERE concat(GroupID, UserID) in (select concat(GroupID, UserID) as Concat from #temp group by GroupID)
INSERT INTO your_table (col1, col2)
SELECT col1, col2 
FROM #temp
DROP TABLE #temp

至于 cte 和临时表之间的高级差异。临时表是物理存储,您可以为它们编制索引。CTE 是命名的子查询,不存储为表/对象。

最新更新