微软的SQL Server中是不允许在union查询中使用 order by。可是如果你非要使用这样的功能,那也是可以实现的,只不过要绕弯路,而且将会损失很大的性能。
一张艺术图书表BaseData_ArtBooks 和经济类图书表BaseData_ConomyBooks ,需要查询所有的图书信息,艺术图书排前面,经济类图书排后面,分别按字母顺序,则可能会想写一个这样的Sql语句:
SELECT * FROM BaseData_ArtBooks order by BookName
union all
SELECT * FROM BaseData_ConomyBooks order by BookName
使用上面的语句SQL Server是会报错的,union附加语法错误。
解决这个办法,可以让order by 和union分开,不在同一个层级的查询语句, 让order在子查询内而union在外面:
SELECT * FROM (SELECT * FROM BaseData_ArtBooks order by BookName) A
union all
SELECT * FROM (SELECT * FROM BaseData_ConomyBooks order by BookName) B
上面的查询语句也是错误的,它违反了SQL Server子查询的语法规则: 如果不存在TOP语句则order by子句无效. 所以可以改成这样:
SELECT * FROM (SELECT TOP 10 * FROM BaseData_ArtBooks order by BookName) A union all
SELECT * FROM (SELECT TOP 10 * FROM BaseData_ConomyBooks order by BookName) B
现在你可以使用了,不过这里再次提醒,如果数据量非常之巨大,那么效率将很低的!
2009年4月14日星期二
订阅:
博文评论 (Atom)
没有评论:
发表评论