在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插入数据?
我正在考虑以某种方式使用临时表,但我不知道是否真的存在差异。
答案 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被命名为子查询,不存储为表格/对象。