oracle sql语句的union效率问题【急】【急】【急】

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle sql语句的union效率问题【急】【急】【急】相关的知识,希望对你有一定的参考价值。

请教大家一个问题:
oracle查询 有三个sql 查询出的字段是相同的。
sql1 用了10s ,sql2用了5s,sql3用了10s
我查询 sql1 union all sql2 union all sql3怎么就查询不出来呢?耗时很久了都死活不出数据。

前提跟大家说一下,查询表是大约有10万数据量,每个sql都有单独的统计逻辑。
语句太复杂:简单概括两种情况
select s1.vendorid, s1.dn,s1.node, SUM(clear_during) duration
from (
/*情况1*/ select his.vendorid,
his.node,
his.dn,
his.occur_time,
his.clr_time,
clear_during
from rt_data_al_00_ecpex his
where his.occur_time <=
to_date('2008-4-12 23:59:00','yyyy-mm-dd hh24:mi:ss')
and his.clr_time >
to_date('2008-4-12 23:59:00','yyyy-mm-dd hh24:mi:ss')
and vendorid=3
and network_type=15 and clr_by='system'
union all
/*情况2*/
--sql省略,跟第一种情况想象,因为补充问题有字数限制,所以不再粘贴
) s1

参考技术A 把语句贴出来,你不要group by的吗?是不是忘记了?如果有的话请先执行嵌套表S1,s1可以查询出来了再做聚合

select s1.vendorid, s1.dn,s1.node, SUM(clear_during) duration
from (
/*情况1*/ select his.vendorid,
his.node,
his.dn,
his.occur_time,
his.clr_time,
clear_during
from rt_data_al_00_ecpex his
where his.occur_time <=
to_date('2008-4-12 23:59:00','yyyy-mm-dd hh24:mi:ss')
and his.clr_time >
to_date('2008-4-12 23:59:00','yyyy-mm-dd hh24:mi:ss')
and vendorid=3
and network_type=15 and clr_by='system'
union all
/*情况2*/
--sql省略,跟第一种情况想象,因为补充问题有字数限制,所以不再粘贴
) s1
group by s1.vendorid, s1.dn,s1.node
参考技术B 也不太复杂,最好还是把全部的sql贴出来,想办法贴出来,这样更好分析效率。 参考技术C 请问 你不是说3个句子 参考技术D 建临时表本回答被提问者采纳

ORACLE 两个order by的SQL使用 UNION 或者 UNION ALL 报错 ORA-00933:sql命令未正确结束

 

在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

 

参考:https://blog.csdn.net/zhx624/article/details/20373785

以上是关于oracle sql语句的union效率问题【急】【急】【急】的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE 两个order by的SQL使用 UNION 或者 UNION ALL 报错 ORA-00933:sql命令未正确结束

oracle 里SQL语句UNION怎么用

Union all和Union差别

Oracle---使用日常

SQL语句中:UNION与UNION ALL的区别

SQL语句中:UNION与UNION ALL的区别