日期:2014-05-16  浏览次数:20426 次

解决union后order by失效的办法
今天遇到了union后order by失效的情况,具体情况我就偷懒摘抄了网上的一个示例,如下:

比如有一张学生表student 和教师表 teacher , 我们要查询所有的教师学生的姓名和年龄,教师排前面,学生排后面,分别按字母顺序,则可能会想写一个这样的Sql语句: (注意,这个语句只是为了说明问题,这并不是一个正确的语句)
SELECT Name,Age FROM Teacher ORDER BY Name 
UNION 
SELECT Name,Age FROM Student ORDER BY Name

实际上,MSSQL并不允许我们写这样的语句,因此将会报错 UNION 附近有语法错误.

示例中作者给出了解决办法如下(这个我没试过,感觉这个方法太奇怪,纯粹是为了解决问题而凑出来的):
SELECT * FROM (SELECT TOP 99.999999 PERCENT Name,Age FROM Teacher ORDER BY Name) A 
UNION 
SELECT * FROM (SELECT TOP 99.999999 PERCENT Name,Age FROM Student ORDER BY Name) B


我想其实大多数情况下排序的字段应该是同一个,于是我想到了下面的方法,经测试可以实现:
(SELECT 1 as type, t.Name,t.Age FROM Teacher t)
UNION 
(SELECT 2 as type, s.Name,s.Age FROM Student s) ORDER BY type,Name