今天遇到了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