zoukankan      html  css  js  c++  java
  • UNION 查询中的排序

    MSSQL 不允许在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 附近有语法错误.

    其实我们只需要绕开,让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 PERCENT Name,Age FROM Teacher ORDER BY Name) A 
    UNION 
    SELECT * FROM (SELECTTOP 100 PERCENT Name,Age FROM Student ORDER BY Name) B

    这就是最后的结果, 为了让ORDER BY 和UNION同时发挥作用,绕了2个弯.

    如果想Union前面和后面的集合分开,使用Union all,但要去除重复的记录。

  • 相关阅读:
    String
    Array常用方法
    Array类
    ruby调试/练习时的小技巧
    集合类对象的遍历处理办法
    Tech road one step 7-Noc to 13-Nov
    Tech road one step 31-Oct 6-Nov
    TechRoad_oneStep_17-23 10
    TechRoad_oneStep_1001
    TechRoad_oneStep_0919
  • 原文地址:https://www.cnblogs.com/fumj/p/3248251.html
Copyright © 2011-2022 走看看