【问题标题】:TSQL - CTE/#Temp TableTSQL - CTE/#Temp 表
【发布时间】:2018-03-14 21:49:17
【问题描述】:

在 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 呢?这不是有效的语法。
  • 如果您的目标是同一张表,您可能会使用与 MERGE 相关的 CTE

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


【解决方案1】:

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 是命名的子查询,不存储为表/对象。

【讨论】:

  • 我明白了,我想我会试试这个:)
  • 不正确。 CTE 只是语法。它没有运行和存储。
猜你喜欢
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 2019-10-09
  • 2012-11-03
  • 1970-01-01
  • 2012-03-21
  • 2010-12-13
  • 1970-01-01
相关资源
最近更新 更多