SQL*_*wbe 5 temp-tables common-table-expression table-variable sql-server-2014
任何人都可以告诉我在哪里使用CTE,temp table和table variable?
我读到他们的差异,但我对他们的用法感到困惑.请帮忙.
谢谢.
您可以使用CTE代替子查询,或者在需要递归时使用CTE.
CTE仅在包含它的SQL语句中可用.前面和后面的语句将无法访问它,也不会看到它.它的行为类似于子查询,但可以在以下选择/更新中多次使用.
此查询带子查询,子查询使用两次:
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
Run Code Online (Sandbox Code Playgroud)
可以用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
Run Code Online (Sandbox Code Playgroud)
在这种情况下,这很有用,因为不必多次写入相同的子查询.
递归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
Run Code Online (Sandbox Code Playgroud)
递归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
Run Code Online (Sandbox Code Playgroud)
当您需要存储不太大而且不需要索引的东西时,您也可以使用它们.尽管表声明中的主键或唯一约束将自动创建索引,但您无法手动创建索引.
没有在表变量上创建统计信息,也无法创建统计信息.
当您处理更多数据时,可以使用临时表,这些数据将从索引和统计信息的创建中受益.
在会话中,任何语句都可以在创建表后使用或更改表:
create table #temp
Insert into #temp(...) select ... From data
exec procA
exec procB
exec procC
Run Code Online (Sandbox Code Playgroud)
ProcA,ProcB和ProcC都可以从#temp中选择,插入,删除或更新数据.
表#temp将在用户会话关闭后立即丢弃.
如果您不想在会话之间保留临时表,则可以使用全局临时表(## temp).它将在丢弃或服务器重新启动之前可用.
| 归档时间: |
|
| 查看次数: |
8272 次 |
| 最近记录: |