zoukankan      html  css  js  c++  java
  • 数据库中暂时表,表变量和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最强大之处在于递归查询,如要细致研究能够參考微软的文章.

  • 相关阅读:
    前端开发和网页设计的过去和未来
    Web开发人员vs网页设计师
    Linux最终将会领先于Windows、Mac OS!
    Linux 大爆炸:一个内核,无数发行版
    因PHP漏洞,超过4.5万个中国网站被攻击
    在 Linux 中自动配置 IPv6 地址
    echart-折线图,数据太多想变成鼠标拖动和滚动的效果?以及数据的默认圈圈如何自定义圆圈的样式
    用TweenMax.js动画让数字动起来
    zrender笔记----(数字Number组件)出现的问题和解决办法
    面试题常考&必考之--js中的数组去重和字符串去重
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/4221017.html
Copyright © 2011-2022 走看看