UNION ALL、UNION与ORDER BY

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UNION ALL、UNION与ORDER BY相关的知识,希望对你有一定的参考价值。

参考技术A 一直以为UNION和UNION ALL就是把每个子查询的结果集合并起来,只是UNION要去掉重复项。直到今天发现了一个问题,UNION的子句中不能出现ORDER BY。

解决方法是,要把有ORDER BY的子句作为子查询的子句。

不过呢,就算解决这个问题,子查询的排序和UNION后的结果集排序也没有联系。因为UNION会对两个结果集进行并集操作,去除重复行,按照默认规则的排序。所以UNION只能在整个语句的最后使用ORDER BY才能达到想要的效果。
使用UNION ALL可以保持子结果集原本的顺序,按照子查询的先后顺序合并,靠前的子查询的结果集就排在前面。

至于为什么不能在子句中加ORDER BY,我也不知道……

ORACLE 两个order by的SQL使用 UNION 或者 UNION ALL 报错 ORA-00933:sql命令未正确结束

 

在oracle sql中,要求order by是select语句的最后一个语句,而且一个select语句中只允许出现一个order by语句,而且order by必须位于整个select语句的最后。

union操作实际上做了两部分动作:结果集合并 + 排序,

union all只进行结果集简单合并,不做排序,效率比union高 。

例子:    表一:table1  查询语句 : select  * from table1 t1  order by t1. c1  ;

            表二:table2  查询语句 : select  * from table1 t2  order by  t2.c1  . 

  需求:合并表一表二结果集,使用union  或者 union all 都会报错:ORA-00933 sql命令未正确结束

  原因:oracle 认为第一个order by结束后整个select语句就该结束了,但是发现后面没有逗号(;)或斜线(/)结束符,反而后边有 union all 或者 union,即sql语句并未结束,所以报错。

  解决:使用  with ... as ... select ...

     with s1 as (select  * from table1 t1  order by t1. c1 ),

     s2 as ( select  * from table1 t2  order by  t2.c1 )

     select  *  from s1 union all (此处可以换为 union ) select * from s2

 

参考:https://blog.csdn.net/zhx624/article/details/20373785

以上是关于UNION ALL、UNION与ORDER BY的主要内容,如果未能解决你的问题,请参考以下文章

union all是啥意思

ORACLE 两个order by的SQL使用 UNION 或者 UNION ALL 报错 ORA-00933:sql命令未正确结束

UNION ALL - ORDER BY,排序

使用UNION后,ORDER BY 怎样使用

如何在 union all 中使用 order by

在 MySQL 中使用 Union All 和 Order By