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

时间:2013-08-28 15:35:03

标签: sql tsql sql-server-2008-r2 common-table-expression temp-tables

使用CTE'scommon table expressions)代替使用temp tables是否有好处。

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

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

2 个答案:

答案 0 :(得分:14)

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

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

来自documentation

  

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

     

CTE可用于:

     
      
  1. 创建递归查询。有关更多信息,请参阅使用公用表表达式的递归查询。

  2.   
  3. 在不需要一般使用视图时替换视图;也就是说,您不必将定义存储在元数据中。

  4.   
  5. 通过从标量子选择派生的列或不具有确定性或具有外部访问权限的函数启用分组。

  6.   
  7. 在同一语句中多次引用结果表。

  8.   

答案 1 :(得分: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