始创于2000年 股票代码:831685
咨询热线:0371-60135900 注册有礼 登录
  • 挂牌上市企业
  • 60秒人工响应
  • 99.99%连通率
  • 7*24h人工
  • 故障100倍补偿
您的位置: 网站首页 > 帮助中心>文章内容

Oracle union all和order by一起使用

发布时间:  2012/8/21 17:08:45

//有时候,我们会将进过排序(order by)后的结果集与    
//其他经过排序的结果集进行合并(union or union all)    
//比如:    
select * from tb where length(id)=5 order by id desc    
-
 

union all    
select * from tb where length(id)=10 order by id asc    
//通常情况下,上面的查询将会得到下面的错误提示:    
//ORA-00933: SQL command not properly ended    
//错误指向union关键字这里    
//下面我们来看一个具体的实例:    
//    
create table t as    
select 'china' col_1,'america' col_2,'canada' col_3,-1 status from dual union all    
select '花生','瓜子','绿豆',0 from dual union all    
select '牙膏','牙刷','杯子',3 from dual union all    
select '芍药','牡丹','月季',1 from dual union all    
select '优乐美','香飘飘','炸鸡',2 from dual    
/    
//需求:    
//有如上表t,status字段的取值范围:[-1,3]    
//我们想要做的是,按照这样的方式排序0,1,2,3,-1    
//    
//解法:    
//更具题义,我们需要将status分为两个区域(>0 和<0)    
//然后分别对每一个区域内的数据进行order by排序    
//于是有下面的查询    
select col_1,col_2,col_3,status    
from t    
where status >= 0     
order by status  --1    
union    
select col_1,col_2,col_3,status    
from t    
where status < 0    
order by status  --2    
/    
//不幸的是,正如刚刚开始时我提示的一样,我们得到了下面的错误提示:    
//ORA-00933: SQL command not properly ended    
//如果将第一个select语句的order by子句去掉,得到的又不是我们想要的结果    
//如果将两个排序子句都去掉的话,虽然按照status为正负数分开了,但是没有排序    
//下面我们来看看正确的答案吧!  
//解法一:  
select * from (    
       select col_1,col_2,col_3,status    
       from t    
       where status >= 0    
       order by status)    
union all    
select * from (    
       select col_1,col_2,col_3,status    
       from t    
       where status < 0    
       order by status)    
/    
COL_1  COL_2   COL_3      STATUS    
------ ------- ------ ----------    
花生   瓜子    绿豆            0    
芍药   牡丹    月季            1    
优乐美 香飘飘  炸鸡            2    
牙膏   牙刷    杯子            3    
china  america canada         -1   
//解法二:  
select * from t   
order by   
      decode(status,  
             -1,1,  
             3,2,  
             2,3,  
             1,4,  
             0,5) desc  
/  
//这可是一个很妙的排序,本人首次看到在order by语句中可以使用decode()函数来排序  
//同理,我们也可以使用case语句来排序:  
//解法三:  
select * from t   
order by   
      case status  
      when -1 then 5  
      when 3 then 4   
      when 2 then 3   
      when 1 then 2   
      else 1  
      end   
/  
//union 和union all中都支持order by和group by排序和分组子句 
 


本文出自:亿恩科技【www.enkj.com】

服务器租用/服务器托管中国五强!虚拟主机域名注册顶级提供商!15年品质保障!--亿恩科技[ENKJ.COM]

  • 您可能在找
  • 亿恩北京公司:
  • 经营性ICP/ISP证:京B2-20150015
  • 亿恩郑州公司:
  • 经营性ICP/ISP/IDC证:豫B1.B2-20060070
  • 亿恩南昌公司:
  • 经营性ICP/ISP证:赣B2-20080012
  • 服务器/云主机 24小时售后服务电话:0371-60135900
  • 虚拟主机/智能建站 24小时售后服务电话:0371-60135900
  • 专注服务器托管17年
    扫扫关注-微信公众号
    0371-60135900
    Copyright© 1999-2019 ENKJ All Rights Reserved 亿恩科技 版权所有  地址:郑州市高新区翠竹街1号总部企业基地亿恩大厦  法律顾问:河南亚太人律师事务所郝建锋、杜慧月律师   京公网安备41019702002023号
      0
     
     
     
     

    0371-60135900
    7*24小时客服服务热线