数据库中暂时表,表变量和CTE使用优势极其差别


1
在写SQL时常常会用到暂时表,表变量和CTE,这三者在使用时各有优势:

1. 暂时表:分为局部暂时表和全局暂时表.

  1.1局部暂时表,创建时以#开头,在系统数据库tempdb中存储. 在当前的链接可见,链接断开则暂时表就自己主动被释放,也能够手动drop table #tmptable

在使用不同的链接同一时候创建同样的暂时表时,互不影响,系统在tempdb中会自己主动附加以特定的session为标识的名字来区分. 经常在SP中使用,把须要操作的数据或者共同的数据取出放在暂时表中,兴许能够进行其它的操作(SELECT,UPDATE,DELETE,DROP等).

 能够像创建永久表一样创建暂时表:

 
     
CREATE TABLE #tmpTable
(
ID
INT ,
NAME
VARCHAR ( 10 ),
COMPANY
VARCHAR ( 50 )
)

SELECT * FROM #tmpTable JOIN ...

DROP TABLE #tmpTable

也能够使用INTO创建暂时表,如查询EmployeeID=1的全部订单,放在暂时表中,以备兴许的处理.

 
     
SELECT E.EmployeeID,E.FirstName,E.LastName,O.OrderID,O.CustomerID,O.OrderDate
INTO #tmpTable
FROM Orders O JOIN Employees E ON O.EmployeeID = E.EmployeeID
WHERE E.EmployeeID = 1

 

 1.2全局暂时表,创建时以##开头. 在tempdb中存储,对全部的session都可见.

 
     
CREATE TABLE ##tmpTable2
(
ID
INT ,
NAME
VARCHAR ( 20 ),
COMPANY
VARCHAR ( 50 )
)
SELECT * FROM ##tmpTable2 JOIN ...

DROP TABLE ##tmpTable2

2.表变量:在内存中存储,比暂时表运行速度快. 在SP或者function越过有效scope之后会自己主动释放,不用显式的写drop.表变量仅仅可用在DML的操作中,会有比較多的限制.

 
       
-- 直接声明表变量
DECLARE @varTable TABLE
(
ID
INT ,
NAME
VARCHAR ( 20 ),
COMPANY
VARCHAR ( 50 )
)


-- 先创建表类型
CREATE TYPE [ dbo ] . [ T_TEMP ] AS TABLE (
ID
INT ,
NAME
VARCHAR ( 20 ),
COMPANY
VARCHAR ( 50 )
)

-- 在声明表变量
DECLARE @varTable T_TEMP

3.CTE(Common Table Expressions)通用表表达:是一个能够由定义语句引用的暂时命名的结果集,在它们的简单形式中,可将 CTE 视为类似于非持续性类型视图的派生表.仅仅须定义 CTE 一次,就可以在查询中多次引用.

 
      
WITH CTE_NAME
AS
(
SELECT E.EmployeeID,E.FirstName,E.LastName,O.OrderID,O.CustomerID,O.OrderDate
FROM Orders O JOIN Employees E ON O.EmployeeID = E.EmployeeID
WHERE E.EmployeeID = 1
)
SELECT * FROM CTE_NAME

 

CTE最强大之处在于递归查询,如要细致研究能够參考微软的文章.

转载于:https://www.cnblogs.com/gcczhongduan/p/4221017.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值