带有子句与临时表的SQL Server

Foo*_*Foo 12 sql-server sql-server-2008-r2

我也可以

select * into #randomTenUsers from
(select top 10 * from users)x    

select * from #randomTenUsers
Run Code Online (Sandbox Code Playgroud)

要么

WITH randomTenUsers   as (select top 10 * from users)    

select * from randomTenUsers
Run Code Online (Sandbox Code Playgroud)

根据我的理解,WITH语句还会创建一个临时结果集.

有没有理由认为WITH应优先于临时表,反之亦然?

Mik*_*son 19

根据我的理解,WITH语句还会创建一个临时结果集.

不,不是的.使用CTE不会创建"临时结果集".查询可能有理由创建工作表,但仅仅因为您使用CTE不是其中之一.

这两个查询具有相同的查询计划,并且它们都不会像tempdb中的临时表那样创建临时结果.


with randomTenUsers as
(
  select top 10 *
  from users
)    
select * 
from randomTenUsers;
Run Code Online (Sandbox Code Playgroud)
select * 
from (
     select top 10 * 
     from users
     ) x;
Run Code Online (Sandbox Code Playgroud)

正如marc_s在评论中所说,你应该使用什么取决于你想做什么.在某些情况下,创建临时表非常有意义,有些情况下完全没有必要.

  • @Foo它可以在查询中的多个地方重用.它也可以在其中重用,以构建一个reqursive查询. (2认同)