[20140812]union all与order by.txt

[20140812]union all与order by.txt

--昨天同事问一个sql的问题,关于union all与order by的问题.做一个简单的记录:

SCOTT@test> @ver

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

SCOTT@test> create table t1 as select rownum id from dual connect by levelTable created.

SCOTT@test> create table t2 as select 7-rownum id from dual connect by levelTable created.

SCOTT@test> create table t3 as select * from t1 where 1=2;
Table created.

insert into t3 (id ) values (8);
insert into t3 (id ) values (9);
insert into t3 (id ) values (7);
commit;

execute dbms_stats.gather_table_stats(user,'t1',cascade=>true,method_opt=>'for all columns size 1 ',no_invalidate=>false);
execute dbms_stats.gather_table_stats(user,'t2',cascade=>true,method_opt=>'for all columns size 1 ',no_invalidate=>false);
execute dbms_stats.gather_table_stats(user,'t3',cascade=>true,method_opt=>'for all columns size 1 ',no_invalidate=>false);

如果写成如下:

select * from t1
union all
select * from t2 order by 1
union all
select * from t3;

union all
*
ERROR at line 4:
ORA-00933: SQL command not properly ended

--许多人认为union all里面不能使用order by.但是如果写成如下,没有问题:
select * from t1
union all
select * from t2
union all
select * from t3 order by 1;

        ID
----------
         1
         2
         3
         4
         5
         6
         7
         8
         9

9 rows selected.

--实际上order by在union all中对整个结果集排序,这样仅仅出现在最后.如果想对中间的表t2排序输出.
--只能这样写:

select * from t1
union all
select * from (select * from t2 order by 1)
union all
select * from t3 ;

        ID
----------
         1
         2
         3
         4
         5
         6
         8
         9
         7

--或者写成如下:

with a as (select * from t2 order by 1)
select * from t1
union all
select * from a
union all
select * from t3 ;

时间: 2024-09-27 14:23:28

[20140812]union all与order by.txt的相关文章

使你的 SQL 语句完全优化

我们要做到不但会写SQL,还要做到写出性能优良的SQL语句. (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. (2)WHERE子句中

SELECT语句参数详解

SELECT Name SELECT  --  从表或视图中取出若干行. Synopsis SELECT [ ALL | DISTINCT [ ON ( expression [, ...] ) ] ] * | expression [ AS output_name ] [, ...] [ FROM from_item [, ...] ] [ WHERE condition ] [ GROUP BY expression [, ...] ] [ HAVING condition [, ...]

Oracle 高效SQL

oracle No1:选择合适的优化器No2:共享SQL为了不重复解析相同的SQL语句,在第一次解析之后, ORACLE将SQL语句存放在内存中.这块位于系统全局区域SGA(system global area)的共享池(shared buffer pool)中的内存可以被所有的数据库用户共享. 因此,当你执行一个SQL语句(有时被称为一个游标)时,如果它和之前的执行过的语句完全相同, ORACLE就能很快获得已经被解析的语句以及最好的执行路径. ORACLE的这个功能大大地提高了SQL的执行性

ORACLE SQL性能优化系列 (十四) 完结篇

oracle|性能|优化 46.       连接多个扫描 如果你对一个列和一组有限的值进行比较, 优化器可能执行多次扫描并对结果进行合并连接. 举例:     SELECT *     FROM LODGING     WHERE MANAGER IN ('BILL GATES','KEN MULLER');       优化器可能将它转换成以下形式     SELECT *     FROM LODGING     WHERE MANAGER = 'BILL GATES'     OR MA

第十章-动态链接库编程(一)(3)

10.2.2 调用DLLs 有两种方法可用于调用一个储存在DLLs中的过程. 1.静态调用或显示装载 使用一个外部声明子句,使DLLs在应用程序开始执行前即被装入.例如: function Instr(SourceStr : PChar;Check : Char); Integer; far; external 'UseStr'; 使用这种方法,程序无法在运行时间里决定DLLs的调用.假如一个特定的DLLs在运行时无法使用,则应用程序将无法执行. 2.动态调用或隐式装载 使用Windows AP

Oracle提高sql执行效率的心得建议

sql执行效率一直都是为人所关注,那到底应该怎样提高呢?有什么比较好的方法,下面与大家分享下比较不错的建议,感兴趣的朋友可以参考下,希望对大家有所帮助 复制代码 代码如下: -->FROM子句中包含多个表的情况下,选择记录条数最少的表作为基础表 -->解析WHERE子句是自下而上的 过滤条件要有顺序 -->ORACLE会将'*'转换成列名 -->DELETE会在rollback segment中存放可恢复信息,可以试试TRUNCATE -->COMMIT会释放:1.rollb

数据-怎样用sql语句,使查询速度更快

问题描述 怎样用sql语句,使查询速度更快 在使用数据库的过程中,经常会有10W条甚至100W条级以上的数据记录,使用常规的sql语句在这种级别的数据库中查询,反馈的速度非常慢,时有几分钟才能得到查询反馈的数据结果:本人曾经看过一个sql语句,能在100W级的数据记录中,只用几秒的时间就得到查询结果,但是现在却不曾记得那条语句是如何写的了,不知哪位大神有类似或者这种技能,能否指点小弟一下 解决方案 1.建立索引 2.优化SQL语句 3.条件精确,使用索引 4.最好使用内部过程 5.只取需要的数据

Oracle SQL性能优化

(1)      选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表.如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表.(2)      WHERE子句中的连接顺序.: ORACLE采用自下而上

百万负载之SQL数据库的优化

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 在考虑一个网站如果承载日百万甚至千万pv时,我们往往本能的往两个方向考虑:静态化及分布式. 固然,对于新浪等门户类型的网站来说,静态化+读写分离及分布式,可以解决大多数的问题.可是我们面临的更多的,可能是大数据+高并发+实时读取,而静态化的固定性便很难解决这个问题. 比如矮个芝麻最近接到的一个电子商务类的网站,流量大,数据量大,同时要求820