SQL Server2008 Order by在union子句不可直接使用(yong)的原因(yin)
按照要(yao)求,每個取top 20,既然(ran)(ran)是隨機(ji)的取,那么就(jiu)SQL Server Order by newid()就(jiu)是了,然(ran)(ran)后(hou)把所(suo)(suo)有數據(ju)union起來就(jiu)得(de)了。所(suo)(suo)以我立即給出了答案:
select top 20 * from xxx where type=1 order by newid()
union
select top 20 * from xxx where type=0 order by newid()
但是在sql 查詢分析(xi)器(qi)種(zhong)不(bu)對,語法有(you)錯,我乍一看,好像沒有(you)問題吧(ba):
select top 20 * from xxx where type=1 order by newid() 單獨執行 都(dou)是沒有問題得;
下面(mian)的半句也是一樣的語法結構,也沒有錯誤。但是把這兩個(ge)查詢(xun)union起(qi)來就錯了(le)。奇怪啊。既然提示(shi)是order附近有錯,那么我將order給去掉(diao):
去掉也是(shi)可以(yi)運行也沒有錯啊(a)。也就是(shi)說(shuo)在union子句中的查詢不能(neng)用(yong)SQL Server Order by。但(dan)是(shi)這兒我必(bi)須要用(yong)order by啊(a),要不然我怎么取出(chu)隨機的20條記錄(lu)
最終改寫成了:
SELECT * FROM
(select TOP 20 * from dbo.AngelExam where (c='無' or c=null) and (d='無' or d=null) ORDER BY newid() ) a1
UNION
SELECT * FROM
(select TOP 20 * from dbo.AngelExam where (c='無' or c=null) and (d='無' or d=null) ORDER BY newid()) a2
看著語句(ju)長了不少,有點怪怪得,但是(shi)沒法,不知道為什(shen)么SQL Server中不能在(zai)union子(zi)句(ju)中使用order by,所以(yi)只有外(wai)圍在(zai)包裝(zhuang)一層了。