TSQL - CTE / #Temp表

时间:2018-03-14 21:49:17

标签: tsql common-table-expression sql-server-2016

在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插入数据?

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

1 个答案:

答案 0 :(得分:0)

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和temp表之间的高级别差异。临时表是物理存储,您可以将它们编入索引。 CTE被命名为子查询,不存储为表格/对象。