23

使用CTE's( common table expressions) 而不是使用temp tables.

我在他们两个之间进行了性能测试,但我找不到他们之间有太大的区别。

使用有哪些优缺点CTE'S

4

2 回答 2

16

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

本质上,您不能像使用临时表一样重用 CTE。

文档

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

CTE 可用于:

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

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

  3. 启用按从标量子选择派生的列或非确定性或具有外部访问权限的函数进行分组。

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

于 2013-08-28T15:48:03.180 回答
7

CTE : CTE 代表公用表表达式。它是在 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:也用于临时存储查询结果。但它的生命周期仅限于当前会话。它是使用# 定义的。它不支持递归。

例子:

select * into #tempTable from MHA

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

(没有错误)

select top (5) * from #tempTable
于 2016-02-16T06:10:57.340 回答