数据库中临时表,表变量和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 #tmpTableFROM Orders O JOIN Employees E ON O.EmployeeID=E.EmployeeIDWHERE 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_NAMEAS(SELECT E.EmployeeID,E.FirstName,E.LastName,O.OrderID,O.CustomerID,O.OrderDate FROM Orders O JOIN Employees E ON O.EmployeeID=E.EmployeeIDWHERE E.EmployeeID=1)SELECT * FROM CTE_NAME

CTE最强大之处在于递归查询,如要仔细研究可以参考微软的文章.

时间: 2024-10-10 10:32:29

数据库中临时表,表变量和CTE使用优势极其区别的相关文章

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

1 在写SQL时常常会用到暂时表,表变量和CTE,这三者在使用时各有优势: 1. 暂时表:分为局部暂时表和全局暂时表. 1.1局部暂时表,创建时以#开头,在系统数据库tempdb中存储. 在当前的链接可见,链接断开则暂时表就自己主动被释放,也能够手动drop table #tmptable 在使用不同的链接同一时候创建同样的暂时表时,互不影响,系统在tempdb中会自己主动附加以特定的session为标识的名字来区分. 经常在SP中使用,把须要操作的数据或者共同的数据取出放在暂时表中,兴许能够进

定时从一个数据库表中的数据存储到另外一个数据库中的表,而且怎么处理重复的数据?

原文:http://www.iteye.com/problems/77856 定时从一个数据库表中的数据存储到另外一个数据库中的表,而且怎么处理重复的数据? 表结构肯定是不能破坏,但是临时表如果是自己的数据库还行,问题是这个Oracle数据库是客户的数据库呢,你不能在他的数据库做任何多余的操作吧?还有别的更好的方法吗? 这个真的是比较困难. 首先,你要从客户机oracle取数据,因为这1分钟间隔之内不知道用户机新增加了哪些数据(大部分情况下是用户使用别的系统插入数据,而你又没有这个系统的程序接口

计算数据库中各个表的数据量和每行记录所占用空间--添加架构信息-读后感及知识整理

参考文章: SQL Server 游标运用:查看一个数据库所有表大小信息(Sizes of All Tables in a Database) 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 监控SQLServer 数据库表每天的空间变化情况 仔细拜读上面三位的文章,不会的知识点又参考了MSDN,巩固了知识点如下: 知识点: 1.表的架构信息,涉及的系统对象 sys.schemas 和 INFORMATION_SCHEMA.TABLES,但后者不是官方推荐方式,

Code First添加一个现有数据库中的表

描述 刚刚使用EF,还没搞明白,遇到下面问题,记录一下. 都说EF好用,一直也没用过,以前写代码都是ADO.NET,写起来费时费力还没什么大进展,如果能把这些事简化一下把精力放到逻辑或者更有用的地方岂不是更好.所以想使用EF.Code First,从字面的意思来看是先有代码后有数据库,通过Model来创建数据库,好像只能是通过Model来生成数据库,至少我接触2天以来是这样,项目已经开始一段时间了,数据库已经有一定的数据,虽然是测试数据,但也不想删掉,从新添加数据也是很烦人的事.想找到一种能够不

通过jdbc获取数据库中的表结构

通过jdbc获取数据库中的表结构 主键 各个表字段类型及应用生成实体类 1.JDBC中通过MetaData来获取具体的表的相关信息.可以查询数据库中的有哪些表,表有哪些字段,字段的属性等等.MetaData中通过一系列getXXX函数,将这些信息存放到ResultSet里面,然后返回给用户.关于MetaData的说明网上也有不少,这里我只是从我自身学习的角度来记录一下简单使用JDBC以及获取数据表相关信息的方法. DatabaseMetaData dbmd = con.getMetaData()

如何将一个数据库中的一个表复制到另一个数据库中的表中

如何将一个数据库中的一个表复制到另一个数据库中的表中 2013-09-11 17:13匿名 | 浏览 13763 次 如何将一个数据库中的一个表复制到另一个数据库中的表中两个表的列名不同.有知道的么?SQL语句直接导过去.! 2013-09-12 20:26网友采纳 热心网友 如果另一个库中没有同名的表select * into b数据库.dbo.a表 from a数据库.dbo.a表 where 条件 如果是追加到另一个表中inert into b数据库.dbo.a表select * from

如何快速查看数据库中的表大小

exec sp_spaceused 以上语法可以查看数据库大小 以下可以查看数据库中每个表的数据条数 SELECT   a.name, b.rows FROM      sysobjects AS a INNER JOIN sysindexes AS b ON a.id = b.id WHERE   (a.type = 'u') AND (b.indid IN (0, 1)) ORDER BY b.rows DESC

Java对比两个数据库中的表和字段,写个冷门的东西

Java对比两个数据库中的表和字段,写个冷门的东西 转载的 来源网络 目前所在的项目组距离下个版本上线已经很近了,就面临了一个问题:开发人员在开发库上根据需要增加数据表.数据字段.或者变更了字段类型或者字段长度等等. 由于时间比较紧迫,导致在开发过程中不可能一一把DDL数据库脚本记录下来,在比较大的项目中,比如我所在项目开发的系统大概包含了800张左右的表,字段上10000个的情况下,人工处理明显不可行,所以我们就得通过程序来判断比对,哪些是我们需要新增加的表,哪些是我们需要新增加的字段,哪些是

python生成数据库中所有表的DESC描述

在数据库设计完成之后, 常常需要在 wiki 或其他文档中保存一份数据库中所有表的 desc 描述, 尤其是每个字段的含义和用途. 手动去生成自然是不可取的. 因此, 我编写了一个简单的 python 程序,可以自动生成数据库中所有表的 desc 描述, 并以可读格式输出. # -*- coding: utf-8 -*- # ------------------------------------------------------------------------------- # Name