今天在pub上看到网友的一个关于union all中order by 子句使用的问题。这个问题才我刚开始写sql语句的时候也有这个疑问,后来终于弄明白,再次看到,本人就
总结一下,以便其它网友查阅:
其实在union all连接的多个结果集中,只能最后一个结果集上使用order by 子句,如果其它结果集也使用order by子句,则会报一个 ORA-00933: SQL 命令未正确
结束的错误,下面的例子就可以看出:
SQL> select 1 from dual order by 1
2 union all
3 select 2 from dual order by 1;
union all
*
ERROR 位于第 2 行:
ORA-00933: SQL 命令未正确结束
如果只在最后一个结果上使用order by子句,则会达到正确的结果。
SQL> select 1 from dual
2 union all
3 select 2 from dual order by 1;
1
----------
1
2
需要再次说明的是,虽然只能最后一个结果集上使用order by 子句,但是该子句对整个结果集都产生影响,下面的例子就能看出!
SQL> select 3 from dual
2 union all
3 select 7 from dual
4 union all
5 select 1 from dual
6 union all
7 select 2 from dual
8 order by 1;
3
----------
1
2
3
7
SQL> select * from v$version;
BANNER
----------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
PL/SQL Release 9.2.0.1.0 - Production
CORE 9.2.0.1.0 Production
TNS for 32-bit Windows: Version 9.2.0.1.0 - Production
NLSRTL Version 9.2.0.1.0 - Production
SQL> spool off;