一、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()
0条大神的评论