在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