union的失效介绍
用于合并两个或多个select结果集,它的基础用法及注意点另行查阅。union它的使用也会失效。oracle有时会报错ora-00933或者ora-00907。
原因是两个select中都有order by的使用。一是去掉order by,二是以这个select结果为表外边再套一个select就可以了。
业务描述
今天在公司将以前两个sql结果一块展示出来,然后查询了一下他们的速度很快,但是每一个sql又有几百行。于是用了union,但是发现一直在报ora-00933或者ora-00907。
代码演示
下面代码只提供union的失效处理,不考虑其他的优化
原先内容展示
//查询结果1
select * from A a where a.shop = "衣服" order by a.sellNum;
//查询结果2
select * from A b where b.store = "京东" order by b.sellNum;
错误内容展示
select * from A a where a.shop = "衣服" order by a.sellNum
union
select * from A b where b.store = "京东" order by b.sellNum
正确方式
//方式一处理
select * from (
select * from A a where a.shop = "衣服" order by a.sellNum
)
union
select * from (
select * from A b where b.store = "京东" order by b.sellNum
)
//方式二处理
select * from A a where a.shop = "衣服"
union
select * from A b where b.store = "京东"
下面本人没有经过测试
可以先记录,待有时间测试
with s1 as (select * from A a where a.shop = "衣服"
order by a.sellNum),
s2 as (select * from A b where b.store = "京东" order by b.sellNum)
select * from s1 union select * from s2
union实际做了两部分动作,结果集合并+排序。oracle认为第一个order by结束后整个select语句就该结束了,但是发现后面没有分号,反而出现了union,所以会报错
共同探讨学习技术创建技术氛围Day9884125