一、SQL临时表的使用

       可以用select [字段1,字段2,...,] into #tempTable from table的形式,将查得的结果放到一个临时表,而后再对这个临时表操作。

创建方法:
create table TempTableName,

select [字段1,字段2,...,] into TempTableName from table ,如上所说.

而后便可像使用常规表一样使用它们.

临时表其实是放在数据库tempdb里的一个用户表
分两种:
一种是以#(局部)或##(全局)开头的表,这种表在会话期间存,会话结束则自动删除;
另一种,如果创建时不以#或##开头,而用tempdb.TempTable来命名它,则该表可在数据库重启前一直存在.
以上两种都可手动用
drop table TempTableName 来删除.

此种行不通

二、UNION---联合

         UNION 指令的目的是将两个 SQL 语句的结果合并起来,可以查看你要的查询结果。

例如:

select * from (
select top 10 * from test_question where f_questionType='1' and f_answerType='1'

UNION
select top 2  * from test_question where f_questionType='1' and f_answerType='2'  )s

第一个select top 10是得到test_question表的前10条数据,第二个select top 2是得到test_question表的前2条数据,然后将查到的数据合并起来。

三、SQL中产生随机的结果集的语句----order by newid()

        NEWID()是一个产生随即unique identifier的函数,对于ORDER BY子句来说,如果后面接的是一个常量字符串,那么每次排序的顺序都是一样的,如果后面接的是变量,那么每次排序的结果有可能不同,还有可能相同的情况。举个例子:
SELECT * FROM Users ORDER BY money DESC,NEWID()

       要想每次排序都不同的话,那么NEWID()必须是紧跟在ORDER BY子句后面的。例如:
SELECT * FROM Users ORDER BY NEWID(),money DESC
其实money已经不起作用了。

由于NEWID()每次生成的值都不一样,也就是形成了每次结果集里的记录排列顺序都是不同的。

 

四、UNION与NEWID()结合使用

      首选看(三)中的例子,变动一下就会报错,如下:

select * from (
select top 10 * from test_question where f_questionType='1' and f_answerType='1' order by newid()
UNION
select top 2  * from test_question where f_questionType='1' and f_answerType='2' order by newid()
 )s

错误信息如下:

服务器: 消息 104,级别 15,状态 1,行 1
如果语句中包含 UNION 运算符,那么 ORDER BY 子句中的项就必须出现在选择列表中。

正确写法如下:

//UNION连接几个集合,并且都NEWID()

select * from (
select * from(select top 10 * from test_question where f_questionType='1' and f_answerType='1' order by newid()) a1
UNION
select * from(select top 2  * from test_question where f_questionType='1' and f_answerType='2' order by newid()) b1
 )s where f_valid=1

外面再要用一个select * from()将含ORDER BY 的select语句放在里面,这样就可以了

 

另一种做法是在select子句是加NEWID()做为查询子项,如下:

SELECT Name,NEWID() 
FROM Persons
WHERE ADUserName = '小明'
UNION ALL
SELECT TOP 5 Name,NEWID() 
FROM Persons
ORDER BY NEWID()