使用 CTE
(公共表达式)与使用 临时表
相比,有什么好处呢?
我对两者进行了性能测试,但我发现它们之间没有太大的区别。
那么使用 CTE
有哪些优缺点呢?
使用 CTE
(公共表达式)与使用 临时表
相比,有什么好处呢?
我对两者进行了性能测试,但我发现它们之间没有太大的区别。
那么使用 CTE
有哪些优缺点呢?
CTE和临时表最大的区别可能在于,CTE的执行范围仅限于单个SELECT、INSERT、UPDATE、DELETE或CREATE VIEW语句。
实际上,不能像使用临时表那样重用CTE。
根据文档:
通用表达式(CTE)可以看作是一个在单个SELECT、INSERT、UPDATE、DELETE或CREATE VIEW语句的执行范围内定义的临时结果集。与派生表相似,CTE不作为对象存储,并且只在查询期间存在。与派生表不同的是,CTE可以自引用,并且可以在同一查询中多次引用。
CTE可用于以下方面:
创建递归查询。有关更多信息,请参阅使用通用表达式进行递归查询。
当不需要一般视图的使用时,可以替代视图;也就是说,您不必将其定义存储在元数据中。
使分组由标量子查询或具有非确定性或外部访问的函数导出的列成为可能。
在同一语句中多次引用结果表。
WITH CTE AS (SELECT * FROM MillionRowTable) SELECT TOP 1 * FROM CTE
和INSERT INTO #T SELECT * FROM MillionRowTable; SELECT TOP 1 * FROM #T
之间有很大的区别。 - Martin Smithinsert into #table
后跟 select .. where xyz not in #table
是快速的,但重写为 CTE 会使其变得非常慢。 - Roman StarkovCTE: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
在上面的例子中,我创建了一个名为myCTE的CTE,它只能在上面的查询中使用(我不能在上面的查询之外使用myCTE)。
TEMP: 它也用于在临时基础上存储查询结果。但是其生命周期仅限于当前会话。它是通过使用#来定义的。它不支持递归。
示例:
select * into #tempTable from MHA
(没有错误)
select top (5) * from #tempTable