【SQL】两个带order by查询进行union all报ORA-00933错误的解决方法
2014-03-03 14:44
316 查看
在oracle SQL中,要求order by是select语句的最后一个语句,而且一个select语句中只允许出现一个order by语句,而且order by必须位于整个select语句的最后。
当时是要将一个十分复杂的检索明细查询和一个十分复杂的检索汇总查询的结果进行合并,以简化开发。
开发人员选择使用了union all来连接两个结果集。
※使用union all 而不用union来连接两个检索结果集的原因是,union实际上做了两部分动作:结果集合并+排序,而union all只进行结果集简单合并,不做排序。
我在这里简要做个模拟。
/////////////////////////////////////////////////////
// 1)两个表中的数据
/////////////////////////////////////////////////////
SQL> select * from tb1;
C1 C2
----- ----------
a1001 1
a1002 2
a1003 3
SQL> select * from tb2;
C1 C2
----- ----------
b2001 1
b2002 2
b2003 3
/////////////////////////////////////////////////////
// 2)两个带order by的查询
/////////////////////////////////////////////////////
SQL> select * from tb1 order by c1 desc;
C1 C2
----- ----------
a1003 3
a1002 2
a1001 1
SQL> select * from tb2 order by c1 desc;
C1 C2
----- ----------
b2003 3
b2002 2
b2001 1
/////////////////////////////////////////////////////
// 3)接下来,我们将两个查询的结果用union all合并起来
/////////////////////////////////////////////////////
// 可以看到 直接用union all连接两个子查询时,报出了ORA-00933错误
// 因为 oracle 认为第一个order by结束后整个select语句就该结束了,
// 但是发现后面没有逗号(;)或斜线(/)结束符,反而发现了 union all
/////////////////////////////////////////////////////
SQL> select * from tb1 order by c1 desc
2 union all
3 select * from tb2 order by c1 desc;
union all
*
第 2 行出现错误:
ORA-00933: SQL 命令未正确结束
/////////////////////////////////////////////////////
// 4)接下来,演示一下如何使用with。。as。。select。。
// 将两个查询的结果用union all合并而且能够执行
/////////////////////////////////////////////////////
SQL> with
2 s1 as (
3 select * from tb1 order by c1 desc
4 ),
5 s2 as (
6 select * from tb2 order by c1 desc
7 )
8 select * from s1
9 union all
10 select * from s2;
C1 C2
----- ----------
a1003 3
a1002 2
a1001 1
b2003 3
b2002 2
b2001 1
已选择6行。
当时是要将一个十分复杂的检索明细查询和一个十分复杂的检索汇总查询的结果进行合并,以简化开发。
开发人员选择使用了union all来连接两个结果集。
※使用union all 而不用union来连接两个检索结果集的原因是,union实际上做了两部分动作:结果集合并+排序,而union all只进行结果集简单合并,不做排序。
我在这里简要做个模拟。
/////////////////////////////////////////////////////
// 1)两个表中的数据
/////////////////////////////////////////////////////
SQL> select * from tb1;
C1 C2
----- ----------
a1001 1
a1002 2
a1003 3
SQL> select * from tb2;
C1 C2
----- ----------
b2001 1
b2002 2
b2003 3
/////////////////////////////////////////////////////
// 2)两个带order by的查询
/////////////////////////////////////////////////////
SQL> select * from tb1 order by c1 desc;
C1 C2
----- ----------
a1003 3
a1002 2
a1001 1
SQL> select * from tb2 order by c1 desc;
C1 C2
----- ----------
b2003 3
b2002 2
b2001 1
/////////////////////////////////////////////////////
// 3)接下来,我们将两个查询的结果用union all合并起来
/////////////////////////////////////////////////////
// 可以看到 直接用union all连接两个子查询时,报出了ORA-00933错误
// 因为 oracle 认为第一个order by结束后整个select语句就该结束了,
// 但是发现后面没有逗号(;)或斜线(/)结束符,反而发现了 union all
/////////////////////////////////////////////////////
SQL> select * from tb1 order by c1 desc
2 union all
3 select * from tb2 order by c1 desc;
union all
*
第 2 行出现错误:
ORA-00933: SQL 命令未正确结束
/////////////////////////////////////////////////////
// 4)接下来,演示一下如何使用with。。as。。select。。
// 将两个查询的结果用union all合并而且能够执行
/////////////////////////////////////////////////////
SQL> with
2 s1 as (
3 select * from tb1 order by c1 desc
4 ),
5 s2 as (
6 select * from tb2 order by c1 desc
7 )
8 select * from s1
9 union all
10 select * from s2;
C1 C2
----- ----------
a1003 3
a1002 2
a1001 1
b2003 3
b2002 2
b2001 1
已选择6行。
相关文章推荐
- DB2 SES安装过程中的两个错误SQL6031N和SQL1032N的解决方法
- "执行SQL语句时出现问题操作必须使用一个可更新的查询"错误的解决方法
- 用sql语句,将两个字段合并,并当做条件进行查询的方法
- 使用SqlBulkCopy对象进行大容量复制数据出现Datardader已经存在的错误的解决方法
- 网站后台登录aspcms 提示错误号:-2147467259,错误描述:操作必须使用一个可更新的查询。sql=update AspCms_Content set TimeStatus=0 where TimeStatus=1 and Timeing <= 解决方法。
- Linq从两个edmx(两个数据库)中选取数据进行查找出现错误解决 (指定的 LINQ 表达式包含对与不同上下文关联的查询)
- 两个sql查询使用union之后排序失效的解决方法
- 执行SQL语句时出现问题操作必须使用一个可更新的查询错误的解决方法
- 针对sql错误:“除非另外还指定了 TOP 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效”的原理与解决
- 使用COM来进行WORD或EXECEL导出操作,出现错误: 80070005 解决方法
- PL/SQL中查询Oracle大数(17位以上)时显示科学计数法的解决方法
- nginx关于reload的两个错误解决方法
- sql 2000 无法执行查询,因为一些文件缺少或未注册"的解决方法
- ASP.NET 2.0项目发布后访问遇见的两个小错误的解决方法
- 构造使用IN子句的动态Transact-SQL方法进行编号查询
- 真相大白:为什么Entity Framework不能进行跨数据库查询(附解决方法)
- iBatis查询时报“列名无效”无列名的错误原因及解决方法
- “System.ServiceModel.DomainServices.Client.DomainOperationException:查询"XXX"load操作失败,远程服务器返回了错误:NoFound.……”解决方法
- MySQL的一条慢SQL查询导致整个网站宕机的解决方法
- SQL(MSSQLSERVER)服务启动错误代码3414的解决方法