CTE和TEMP表之间的主要区别是什么?

问题描述 投票:18回答:2

使用CTE'scommon table expressions)而不是使用temp tables有什么好处。

我在两者之间进行了性能测试,但我发现它们之间没有太大区别。

使用CTE'S有什么优点和缺点?

sql tsql sql-server-2008-r2 common-table-expression temp-tables
2个回答
14
投票

可能CTE和临时表之间的最大区别在于CTE具有单个SELECT,INSERT,UPDATE,DELETE或CREATE VIEW语句的执行范围。

基本上你不能像临时表那样重复使用CTE。

来自documentation

公用表表达式(CTE)可以被认为是在单个SELECT,INSERT,UPDATE,DELETE或CREATE VIEW语句的执行范围内定义的临时结果集。 CTE类似于派生表,因为它不作为对象存储,并且仅在查询期间持续。与派生表不同,CTE可以是自引用的,并且可以在同一查询中多次引用。

CTE可用于:

  1. 创建递归查询。有关更多信息,请参阅使用公用表表达式的递归查询。
  2. 在不需要一般使用视图时替换视图;也就是说,您不必将定义存储在元数据中。
  3. 通过从标量子选择派生的列或不具有确定性或具有外部访问权限的函数启用分组。
  4. 在同一语句中多次引用结果表。

5
投票

CTE:CTE代表Common Table表达式。它是随SQL Server 2005引入的。它用于在临时基础上存储复杂子查询的结果。它的生命仅限于当前的查询。它是使用WITH语句定义的。它主要用于递归调用。

;with myCTE as 
(
    select ParentLevel, ParentID, ChildID 
    from MHA 
    where ChildID = 1 
    UNION ALL
    select MHA.ParentLevel, MHA.ParentID, MHA.ChildID 
    from MHA
    inner join myCTE on MHA.ParentID = myCTE.ChildID
    where MHA.ParentID <> 0
)

(错误)

select top (5) * from myCTE

所以在上面的例子中,我创建了CTE名称为myCTE,只能在上面的查询中使用(我不能在上面的查询中使用myCTE)

TEMP:它还用于在临时bases上存储查询结果。但它的生命仅限于当前会话。它是使用#定义的。它不支持递归。

例:

select * into #tempTable from MHA

在上面的查询中我创建了临时表,现在我可以在它的查询中使用它临时表但在会话中。见下文

(没有错误)

select top (5) * from #tempTable
© www.soinside.com 2019 - 2024. All rights reserved.