• MySql中 union all 和 order by 一起使用的问题


    最近使用SQL语句进行UNION查询,惊奇的发现:SQL没问题,UNION查询也没问题,都可以得到想要的结果,可是在对查出的结果进行union的时候,却出问题了(人要爆炸)。

    sql1:
    select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW
     from table_02
     where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%'
     order by ZBID,HC;

    sql2:

    select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW
     from table_03
     where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%'
     order by ZBID,HC;

    然后呢业务需求是需要把这两个查询的结果union all(不使用union的原因是业务上不去掉重复数据)到一起,且数据的顺序不能变动

    正确的结果应该是这样的   图1

    然而当你写这个SQL的时候,select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_02 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC
    union all
    select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_03 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC

    哎,报错了,神奇不!哈哈哈。Incorrect usage of UNION and ORDER BY : UNION和ORDER BY的用法不正确

    如图

    解决方法:在要union的查询用()(英文括号括住),例如

    (select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_02 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC)
    union all
    (select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_03 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC)

    结果如下

     图2

    SQL没有报错是有结果的,不知有没有发现其实数据的顺序其实发生了变化的,注意图1和图2第二条数据,哎发现了吧,是不对了吧。那我就要说对不起了,不行查出的结果不满足我的需求(此时心中一万只草泥马奔驰而过),难道这个问题无解吗?

    别慌,有的。

    ①(select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_02 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC limit 999)
    union all
    (select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW from table_03 where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%' order by ZBID,HC limit 999)

     但是有没有发现什么limit,对 你没有看错就是他,但是这种写法有局限性limit的条数有限。你不会说我可以增大limit的条数,你可以试试我不介意,等到数据量大的时候你就知道了

    下面说下我采用的解决方法

     select a.*
     from (
    (select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW,0 as PAIXU
     from table_02
     where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%'
     order by ZBID,HC)
    union all
    (select ID,ZBID,SORT,T1,RKSJ,HC,DB,LEVEL,PX,BZ,DW,1 as PAIXU
     from table_03
     where SUBSTRING(ZBID,1,4)='3207' and (level='2') and HC like'02%'
     order by ZBID,HC)
     ) a
     order by a.PAIXU,a.ZBID,a.HC;

    有没有发现多了什么,就是它——“PAIXU”列,用它来给sql1和sql2的查询结果先排序,然后在按照sql1和sql2取数据的时候的字段排序(当然了至于是 asc 还是desc 那就看实际需求了),好就这样了。

    悄悄说下我的“0 as PAIXU”和“1 as PAIXU”是用程序生成出来的

  • 相关阅读:
    二分查找 【数组的二分查找】
    二分答案 [TJOI2007]路标设置
    队测 逆序对 permut
    【线段树】 求和
    状压DP Sgu223 骑士
    状压DP Poj3311 Hie with the Pie
    状压DP入门 传球游戏之最小总代价
    状压DP 小W选书籍
    状压DP [Usaco2008 Nov]mixup2 混乱的奶牛
    __gcd()用法
  • 原文地址:https://www.cnblogs.com/bkyqtr/p/14548899.html
Copyright © 2020-2023  润新知