Oracle数据中union all 多表查询的order by 排序问题

今天在开发一个存储过程的是遇到一个问题,Oracle数据库多超过2个表使用union all 查询结果进行排序时报排序字段无效。经一番周折终于解决了问题,在此分享一下解决方法。

3张数据库表:t1,t2,t3

t1表字段id,name,sex

t2表字段no,name,sex

t3表字段sno,name,grad

2表查询语句:select id,name,sex from (select tb.* from (

select id,name,sex from t1

union all  

select no, name,sex from t2

order by id desc) tb)

2表这样查询是没有问题

但是3表查询就会报异常。

3表原来的查询语句

select id,name,sex from (select tb.* from (

select id,name,sex from t1

union all  

select no, name,sex from t2 

union all

select sno,name,grad from t3

order by id desc) tb)

这样查询会报id字段无效,

解决办法是在第二个表为排序字段加一个别名

如下:

select id,name,sex from (select tb.* from (

select id,name,sex from t1

union all  

select no id, name,sex from t2 

union all

select sno,name,grad from t3

order by id desc) tb)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会根据关键词 "oracle union all order by顺序" 创作一段500-1000字的内容。下面是我的创作: 在 Oracle 数据,使用 Union All 语句可以将多个 Select 语句的结果集合并到一起。而在合并结果集的同时,我们可能还需要对最终的结果集进行排序,这时就需要使用 Order By 语句。但是,在使用 Union All 和 Order By 时,有一个需要注意的问题,那就是 Order By 语句的顺序问题。 在 Oracle Union All 和 Order By 的顺序是有讲究的。如果您想对每个 Select 语句的结果集进行排序,需要在每个 Select 语句都使用 Order By 语句,并且在 Union All 之前进行排序。这样才能保证每个 Select 语句的结果集都按照指定的顺序进行排序,最终合并的结果集也会按照这个顺序进行排序。 举个例子,假设我们有两个 table1 和 table2,它们的结构如下: ``` table1 ------ id name age 1 Tom 20 2 Jack 25 3 Mary 30 table2 ------ id name age 4 Peter 22 5 John 27 6 Lucy 32 ``` 如果我们想将这两个数据合并,并按照 age 字段进行排序,那么正确的做法应该是: ``` SELECT id, name, age FROM ( SELECT id, name, age FROM table1 ORDER BY age ) t1 UNION ALL SELECT id, name, age FROM ( SELECT id, name, age FROM table2 ORDER BY age ) t2 ORDER BY age ``` 这样,就会先对 table1 和 table2 数据分别按照 age 字段进行排序,然后再将两个结果集合并,最后再按照 age 字段进行排序。 而如果我们将 Order By 放在 Union All 后面,就会出现问题。例如: ``` SELECT id, name, age FROM table1 UNION ALL SELECT id, name, age FROM table2 ORDER BY age ``` 这样,会先将 table1 和 table2 数据合并,然后再对合并后的结果集按照 age 字段进行排序。这样就无法保证每个 Select 语句的结果集都按照指定的顺序进行排序,最终合并的结果集也可能会出现问题。 综上所述,正确使用 Union All 和 Order By 需要注意顺序问题。如果您想对每个 Select 语句的结果集进行排序,需要在每个 Select 语句都使用 Order By 语句,并且在 Union All 之前进行排序。这样才能保证最终合并的结果集按照指定的顺序进行排序

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值