none
SQL SERVER 2000 ORDER BY和UNION的问题 RRS feed

  • 问题

  • 比如有一张学生表student 和教师表 teacher , 我们要查询所有的教师学生的姓名和年龄,教师排前面,学生排后面,分别按字母顺序,则可能会想写一个这样的Sql语句: (注意,这个语句只是为了说明问题,这并不是一个正确的语句) SELECT Name,Age FROM Teacher ORDER BY Name UNION SELECT Name,Age FROM Student ORDER BY Name 实际上,MSSQL并不允许我们写这样的语句,因此将会报错 UNION 附近有语法错误. 其实我们只需要绕开,让ORDER BY 和UNION 不在同一层, 让ORDER 在子查询内而 UNION 在外面(因为我们要先教师学生分开,然后再名字) 这样得到了另外一个Sql语句:(注意,这依然不是一个正确的语句) SELECT * FROM (SELECT Name,Age FROM Teacher ORDER BY Name) A UNION SELECT * FROM (SELECT Name,Age FROM Student ORDER BY Name) B 这句Sql语句依然无法通过,因为这有触犯了MSSQL的另外一条语法规定,在子查询中, 如果不存在TOP语句则ORDER BY子句无效. 但是我们需要的是全部结果,并不需要TOP的功能. 显然, TOP 100% 是个解决的方法. 因为100%就是全部了. 最后,这条蹩脚的Sql语句出炉了: SELECT * FROM (SELECT TOP 100 PERCEND Name,Age FROM Teacher ORDER BY Name) A UNION SELECT * FROM (SELECTTOP 100 PERCEND Name,Age FROM Student ORDER BY Name) B 这就是最后的结果, 为了让ORDER BY 和UNION同时发挥作用,绕了2个弯.
    可是我按照上面的方法还是报错啊:如果语句中包含 UNION 运算符,那么 ORDER BY 子句中的项就必须出现在选择列表中。 或者有什么方法可以把两个linq查询的结果合并在一起呢?
    • 已移动 Sheng Jiang 蒋晟 2009年11月16日 16:59 SQL语法问题 (发件人:ADO.NET 与 LINQ)
    2009年11月16日 7:52

答案

  • 好像是sql2000 不支持虚拟表,所以不能用这个
    SELECT * FROM (SELECT TOP 100 PERCEND Name,Age FROM Teacher ORDER BY Name) A
    UNION
    SELECT * FROM (SELECTTOP 100 PERCEND Name,Age FROM Student ORDER BY Name) B

    sql2005可以这样写的。
    • 已标记为答案 wanguan2000 2009年11月17日 7:27
    2009年11月17日 7:27

全部回复

  • sql有生命时期阶段 因为union比order先执行造成order排序错误
    2009年11月16日 10:56
  • union 应该改 union all, 从需求来看, 似乎不应该存在去重复的处理(union 会做这个处理.

    2009年11月17日 4:35
  • 好像是sql2000 不支持虚拟表,所以不能用这个
    SELECT * FROM (SELECT TOP 100 PERCEND Name,Age FROM Teacher ORDER BY Name) A
    UNION
    SELECT * FROM (SELECTTOP 100 PERCEND Name,Age FROM Student ORDER BY Name) B

    sql2005可以这样写的。
    • 已标记为答案 wanguan2000 2009年11月17日 7:27
    2009年11月17日 7:27