`
sujianchinaouya
  • 浏览: 53712 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle union all和order by一起使用

阅读更多

Oracle union all和order by一起使用
2011-12-19 15:17

//有时候,我们会将进过排序(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排序和分组子句

 

laizi:http://hi.baidu.com/leeyoungtek/blog/item/8b5416da768e76c5b6fd4890.html

分享到:
评论

相关推荐

    union all与order by用法

    union all与order by用法,并详细举例,oracle pl/sql

    oracle sql of extracting table structure

    union all select distinct lower(all_c.table_name) table_name --,(case -- when column_id || to_char(column_id) -- when column_id (column_id) -- when column_id &gt; 100 then 'H' || substrb(to_char...

    Oracle数据库Sql性能调优

    1.41 用WHERE替代ORDER BY 25 1.42 避免改变索引列的类型. 26 1.43 需要当心的WHERE子句 27 1.44 连接多个扫描 28 1.45 CBO下使用更具选择性的索引 29 1.46 避免使用耗费资源的操作 29 1.47 日期使用 29 1.48 使用...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    4.2.1 UNION和UNION ALL 103 4.2.2 MINUS 106 4.2.3 INTERSECT 107 4.3 集合与空值 108 4.3.1 空值与非直观结果 108 4.3.2 集合运算中的空值行为 110 4.3.3 空值与GROUP BY和ORDER BY 112 4.3.4 空值与聚合...

    最全的oracle常用命令大全.txt

    一、ORACLE的启动和关闭 1、在单机环境下 要想启动或关闭ORACLE系统必须首先切换到ORACLE用户,如下 su - oracle a、启动ORACLE系统 oracle&gt;svrmgrl SVRMGR&gt;connect internal SVRMGR&gt;startup SVRMGR&gt;quit b、关闭...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    oracle建议用户自己设计数据库管理和安全的权限规划,而不要简单的使用这些预定角色。将来的版本中这些角色可能不会作为预定义角色。  DELETE_CATALOG_ROLE, EXECUTE_CATALOG_ROLE,SELECT_CATALOG_ROLE这些角色...

    sql语句生成器+支持各大数据库+说明书

    SQL语句生成器的特色 支持几乎所有类型的数据库, ...联合(Union,对于Oracle 支持Union All,Minus,Intersect) 支持将SQL查询语句,替换为插入(Insert into)和更新(Update)语句  附属工具内嵌入Delphi IDE

    Oracle8i_9i数据库基础

    §2.4.1 用 ORDER BY 子句来对结果进行排序 76 §2.4.2 用 BREAK 命令 来对结果进行排列 76 §2.4.3 用 COMPUTE 命令对结果进行格式化 79 §2.5 配置会话环境 82 §2.5.1 ARRAYSIZE(取回的行数) 82 §2.5.2 ...

    SQL语言生成器(delphi)

    1、支持几乎所有类型的数据库, 包括小型(桌面)数据库:...联合(Union,对于Oracle 支持Union All,Minus,Intersect) 4、支持将SQL查询语句,替换为插入(Insert into)和更新(Update)语句 4、附属工具内嵌入Delphi IDE

    SQL语句自动生成工具

    排序(Order By) 条件(Where) 分组(Group By) 分组条件(Having) 计算字段 SQL查询表 SQL查询子句 丰富的函数 表别名 字段别名(包括计算字段和非计算字段) 联合(Union,对于Oracle ...

    SQL语句自动生成器简体中文版

    排序(Order By) 条件(Where) 分组(Group By) 分组条件(Having) 计算字段 SQL查询表 SQL查询子句 丰富的函数 表别名 字段别名(包括计算字段和非计算字段) 联合(Union,对于Oracle ...

    oracle常用函数汇总(分享)

    = like between is null in逻辑运算符:not and or 集合运算符: intersect ,union, union all, minus 要求:对应集合的列数和数据类型相同 查询中不能包含long 列 列的标签是第一个集合的标签 使用order by时...

    ORACLE精品脚本笔记

    &lt;br&gt;create or replace view ts_blocks_v as select tablespace_name,block_id,bytes,blocks,'free space' segment_name from dba_free_space union all select tablespace_name,block_id,bytes,...

    PLSQL程序优化和性能分析方法

    2.4.10 尽量用union all替换union 13 2.4.11 使用DECODE函数来减少处理时间 13 2.4.12 group by优化 13 2.4.13 尽量避免用order by 14 2.4.14 用Where子句替换HAVING子句 14 2.4.15 使用表的别名(Alias) 14 2.4.16 ...

    Oracle 10g 开发与管理

    (3)Some、Any和All 53 五.表的查询练习 54 第七讲 PL/SQL编程基础 56 7.1 PL/SQL 程序结构 56 1.PL/SQL块结构 56 2.PL/SQL块的分类(按照特性划分) 56 7.2变量与常量 56 (一)PL/SQL标识符 (给变量命名) 56 ...

    SQL语句生成及分析器

    联合(Union,Union All,Minus,Intersect) 4、SQL语句反向分析 无论多么复杂的语句,都能分析出来(包括SQL各子句中嵌套的SQL语句) 5、数据库视图定义和重建 6、支持将SQL查询语句,替换为插入(Insert into)和更新...

    精通SQL 结构化查询语言详解

    9.4.3 ORDER BY子句排序UNION运算结果  9.4.4 对多表进行UNION运算  9.4.5 UNION JOIN 连接表  9.5 表连接的其他应用及注意问题  9.5.1 连接表进行聚合运算  9.5.2 多表连接的综合运用  9.5.3 多表连接...

    SQL语句生成及分析器(中文绿色)

    3.8 联合 (Union [All],Minus,Intersect) 3.9 字段别名,数据表别名 3.10 SQL子查询表,内嵌SQL子句 4、粘贴字段、系统函数 5、SQL查询语句反向分析, 无论多么复杂的语句,都能分析得出来 包括上面提到...

    sql语句生成与分析器.rar

    3.8 联合 (Union [All],Minus,Intersect) 3.9 字段别名,数据表别名 3.10 SQL子查询表,内嵌SQL子句 4、粘贴字段、系统函数 5、SQL查询语句反向分析, 无论多么复杂的语句,都能分析得出来 包括上面提到...

Global site tag (gtag.js) - Google Analytics