CTE、临时表和表变量



谁能告诉我在哪里使用CTE, temp tabletable variable ?

我读到了它们的不同之处,但我对它们的用法感到困惑。请帮助。

谢谢。

您可以使用CTE来代替子查询,或者当您需要递归性时。

CTE仅在包含它的SQL语句中可用。前面和后面的语句不能访问它,也看不到它。它的行为类似于子查询,但可以在下面的select/update中多次使用。

子查询,子查询使用两次:

Select D.* From D
Inner Join (
        Select id value, date From A
        Inner Join B on A.data < B.date
        Inner Join C on C.data > B.date
    ) CTE a c1 on c1.id = D.id+1
Inner Join (
    Select id value, date From A
    Inner Join B on A.data < B.date
    Inner Join C on C.data > B.date
) as c2 on c2.id = D.id-1

可以用CTE代替:

; with CTE as (
    Select id value, date From A
    Inner Join B on A.data < B.date
    Inner Join C on C.data > B.date
)
Select D.* From D
Inner Join CTE as c1 on c1.id = D.id+1
Inner Join CTE as c2 on c2.id = D.id-1

这在这种情况下很有用,因为相同的子查询不需要写几次。

递归CTE(这只是一个例子,这不应该是SQL Server的作业操作字符串数据像这样):

Declare @data varchar(50) = 'Recursive CTE' 
; With list(id, letter) as (
    Select 1, SUBSTRING(@data, 1, 1)
    Union All
    Select id+1, SUBSTRING(@data, id+1, 1) From list
    Where id < len(@data)
) 
Select * from list

递归CTE可用于检索层次结构中的数据。

<标题> 表变量

表变量只在执行查询时存在。它在创建后对所有SQL语句可见。

当您需要使用表类型参数将数据传递给存储过程或函数时,可以使用它们:

Create Proc test(
    @id int,
    @list table_type_list READONLY
)
begin
    set nocount on
    select * from @list
end
Declare @t table_type_list
Insert into @t(name) values('a'), ('b'), ('c')
Exec test 1, @t

当你需要存储不太大且不需要索引的东西时,你也可以使用它们。您不能手动创建索引,尽管表声明中的主键或唯一约束将自动创建索引。

没有在表变量上创建统计信息,也不能创建统计信息。

<标题> 临时表

Temp表可以在处理大量数据时使用,这将受益于创建索引和统计信息。

在会话中,一旦表被创建,任何语句都可以使用或修改表:

create table #temp
Insert into #temp(...) select ... From data
exec procA
exec procB
exec procC

ProcA, ProcB和ProcC都可以从#temp中选择,插入,删除或更新数据。

表#temp将在用户会话关闭后立即删除。

如果你不想在会话之间保留临时表,你可以使用全局临时表(##temp)。

相关内容

  • 没有找到相关文章

最新更新