SQL临时表简介

 转帖:http://hi.baidu.com/qianko/blog/item/6d6907d6c089732b06088bbb.html

 

首先我们来熟悉下临时表的概念:

     临时表与永久表相似,但临时表存储在 tempdb 中,当不再使用时会自动删除。临时表有两种类型:本地和全局。它们在名称、可见性以及可用性上有区别。本地临时表的名称以单个数字符号 (#) 打头;它们仅对当前的用户连接是可见的;当用户从 SQL Server 实例断开连接时被删除。全局临时表的名称以两个数字符号 (##) 打头,创建后对任何用户都是可见的,当所有引用该表的用户从 SQL Server 断开连接时被删除。

      例如,如果创建了 employees 表,则任何在数据库中有使用该表的安全权限的用户都可以使用该表,除非已将其删除。如果数据库会话创建了本地临时表 #employees,则仅会话可以使用该表,会话断开连接后就将该表删除。如果创建了 ##employees 全局临时表,则数据库中的任何用户均可使用该表。如果该表在您创建后没有其他用户使用,则当您断开连接时该表删除。如果您创建该表后另一个用户在使用该表,则 SQL Server 将在您断开连接并且所有其他会话不再使用该表时将其删除。

conn.Execute("SELECT newscomment_user_id AS user_id, COUNT(*) AS counter INTO #userNewsComment1 " _
          & " FROM newsComment GROUP BY newscomment_user_id ")
          '把从newsComment中或的数据集合写入到临时表 #userNewsComment1 中
          'newsComment是新闻评价表


         Set rs = conn.Execute("SELECT TOP 10 a.user_id AS trueId, * FROM userInfo AS a INNER JOIN userPoint AS b " _
          & " ON a.user_id = b.user_id INNER JOIN View_Company AS c ON a.user_id = c.user_id " _
          & " LEFT OUTER JOIN     #userNewsComment1 AS d ON d.user_id = a.user_id " _
          & " WHERE user_isProvinceNewsShow = 1 " _
          & placeCondition & " ORDER BY d.counter DESC ")

        conn.execute("drop table #userNewsComment1")
        '使用完记住删除临时表,这里是删除临时表对象

这里是把临时表运用上

1、临时表就是用户在创建表的时候添加了“#”前缀的表,其特点是根据进程独立。只有进程的拥有者有表的访问权限,其它用户不能访问该表;
2、不同的用户进程,创建的临时表虽然“名字”相同,但是这些表之间相互并不存在任何关系;在SQLSERVER中,通过特别的命名机制保证临时表的进程独立性。
3、定单和购买意向一般不会保存在真正的“临时表”中,而是实际的普通表,之所以称之为“临时表”,只是一种叫法而已。因为随着一个用户进程的结束,真正的临时表会自动清除,而定单和购买意向数据一般是定时清除,所以一定是保存在普通表中,具备数据的持久性特征(临时表最缺乏的就是数据的持久性)。
4、真正的临时表利用了数据库临时表空间,由数据库系统自动进行维护,因此节省了表空间。并且由于临时表空间一般利用虚拟内存,大大减少了硬盘的I/O次数,因此也提高了系统效率。

事务完毕或会话完毕数据自动清空,不必记得用完后删除数据。
      数据当前会话期可见,其它的会话只能看到其结构,只能看到自己的数据,各会话的数据互不干扰。 如静态创建临时表t_tmp(a number primary key,b number)
    用户A可以有数据                 用户B可以有数据
       1 2                          1 2
       2 3                          3 4
       3 4                          6 7
       4 5
A)select count(*) from t_emp; 结果为4(B的数据它看不到)
B)select count(*) from t_emp; 结果为3(A的数据它看不到)
     它们有相同的两条记录,但由于数据只作用于当前会话期,所以primary key不会限制它们,只限制当前用户下的A唯一主键。
     上述互不干扰特性可以用于处理中间计算过程,如果是常规表在同一时间仅能被一个会话操作,锁定资源拒绝被其它会话访问。

### 创建和使用临时表SQL 中,临时表是一种用于存储中间结果的结构,其生命周期通常与当前会话或查询绑定。根据不同的需求,可以使用多种方法来创建和使用临时表。 #### 局部临时表与全局临时表 SQL Server 支持两种类型的临时表:局部临时表和全局临时表。局部临时表以单个井号 `#` 开头,仅对当前会话可见,并且会在会话结束时自动删除;而全局临时表以两个井号 `##` 开头,对所有会话都可见,直到创建它的会话和其他正在使用它的会话都结束才会被删除[^2]。 ##### 使用 CREATE TEMPORARY TABLE 创建临时表 可以通过 `CREATE TEMPORARY TABLE` 语句显式地创建一个临时表,并定义其结构: ```sql CREATE TEMPORARY TABLE #Tmp ( ID INT IDENTITY (1,1) NOT NULL, WokNo VARCHAR(50), PRIMARY KEY (ID) ); ``` 此语句创建了一个为 `#Tmp` 的局部临时表,包含一个自增主键 `ID` 和一个 `VARCHAR` 类型的 `WokNo` 字段[^2]。 ##### 使用 SELECT INTO 创建临时表 另一种隐式创建临时表的方式是通过 `SELECT INTO` 语句从现有中选择数据并同时创建新: ```sql SELECT * INTO #jimmy FROM table WHERE 1=1; ``` 这条命令将从 `table` 中选取满足条件的数据(此处 `WHERE 1=1` 是一个始终为真的条件,常用于构建动态查询)并存入新的局部临时表 `#jimmy` 中[^2]。 #### WITH 子句作为替代方案 如果不需要跨多个查询重用临时表,并且只需要在一个查询中利用中间结果,则可以考虑使用 `WITH` 子句来生成一个临时的结果集: ```sql WITH temp AS ( SELECT column1, column2 FROM original_table WHERE conditions ) SELECT * FROM temp WHERE other_conditions; ``` 这种方式不会实际创建物理上的临时表,而是逻辑上产生一个可以在后续查询中引用的临时结果集[^1]。 #### 操作临时表 一旦创建了临时表,就可以对其进行标准的 DML 操作,如插入、更新和删除记录等。对于清空临时表中的数据,可以使用 `TRUNCATE TABLE` 命令[^2]: ```sql TRUNCATE TABLE #Tmp; ``` 当不再需要临时表时,应当显式地将其删除以释放资源: ```sql DROP TABLE #Tmp; ``` 此外,在尝试创建一个新的临时表之前检查是否已经存在同临时表是一个好的实践习惯,这有助于避免错误: ```sql IF OBJECT_ID('tempdb..#jimmy') IS NOT NULL BEGIN DROP TABLE #jimmy; END ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值