UNION ALL 和 ORDER BY NEWID 一起使用

当使用UNION ALL或者UNION时,如果按照NewId()随机排序,那么,不能直接写

SQL 代码
SELECT TOP 2 * FROM [ Article ] Where ArticleId < 100 Order By NewId ()
UNION ALL
SELECT TOP 8 * FROM [ Article ] Where ArticleId > 200 Order By NewId ()

如果这样写,运行时会报告错误:在关键字 'UNION' 附近有语法错误。

需要写成

SQL 代码
SELECT * FROM ( SELECT TOP 2 * FROM [ Article ] Where ArticleId < 100 Order By NewId ()) A
UNION ALL
SELECT * FROM ( SELECT TOP 8 * FROM [ Article ] Where ArticleId > 200 Order By NewId ()) B

但是,这些,在SQL Server 2008里面是正确的,但在SQL Server2000里面,仍然会报告错误:如果语句中包含 UNION 运算符,那么 ORDER BY 子句中的项就必须出现在选择列表中。
在SQL Server 2000里面,需要写成

SQL 代码
SELECT * FROM ( SELECT TOP 2 * , NewId () As RandomX FROM [ Article ] Where ArticleId < 100 Order By RandomX) A
UNION ALL
SELECT * FROM ( SELECT TOP 8 * , NewId () As RandomX FROM [ Article ] Where ArticleId > 200 Order By RandomX) B
才可以正常执行。

你可能感兴趣的:(UNION,和,by,order,all,NEWID)