今天在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;