`
sujianchinaouya
  • 浏览: 55316 次
  • 性别: 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用法

    在 Oracle PL/SQL 中, UNION ALL 和 ORDER BY 的使用需要遵循一定的规则和限制。本文将详细介绍 UNION ALL 和 ORDER BY 的用法,并通过实例解释其应用场景。 UNION ALL 的用法 UNION ALL 用于合并两个或多个 ...

    Oracle中Union与Union All的区别(适用多个数据库)

    在使用 `UNION` 和 `UNION ALL` 时,注意不需要在每个 `SELECT` 语句中都使用 `ORDER BY`。你可以只在最后的 `UNION` 或 `UNION ALL` 之后添加一个 `ORDER BY` 子句来对整个结果集进行排序,如: ```sql SELECT ...

    Oracle集合操作函数union、intersect、minus.docx

    在使用集合操作符时,可以使用 ORDER BY 子句对结果集进行排序。例如: SELECT id, name FROM worker UNION ALL SELECT empno, ename FROM emp ORDER BY name; 在上面的例子中,ORDER BY 子句将对合并后的结果集...

    Oracle 多行记录合并_连接_聚合字符串的几种方法_oracle_脚本之家1

    Oracle数据库在处理多行记录合并、连接和聚合字符串时,有多种方法,下面将详细介绍其中的几种常见技术。 1. 被集合字段范围小且固定型 这种方法适用于字段值有限且已知的情况。通过使用`DECODE`函数,我们可以为每...

    Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数(转载)

    `OVER (PARTITION BY ...)` 和开窗函数在Oracle数据库中提供了极其强大的数据处理能力,特别是在需要进行复杂的数据分析或报表制作时。掌握这些技术对于提高数据库查询效率和数据处理能力至关重要。

    Oracle和SqlServer语法区别

    PL/SQL函数和过程可以使用Oracle的函数和过程语法来编写,而Transact-SQL函数和过程则需要使用SqlServer的函数和过程语法。 例如,Oracle的PL/SQL函数可以这样编写: ```plsql CREATE OR REPLACE FUNCTION get_...

    Oracle多行记录合并

    - **`UNION ALL` 或 `UNION`:** 虽然这不是直接的合并,但通过将结果集合并,可以达到类似的效果。例如,如果你有多个视图或表,每个都有一部分数据,可以使用这些操作将它们组合在一起。 3. **`CONNECT BY` 和 `...

    Oracle提高查询效率的方法

    "Oracle 提高查询效率的方法" Oracle数据管理系统作为...提高 Oracle 查询效率需要从多方面考虑,包括优化 SQL 语句、创建合理的索引、选择合适的基础表、调整 WHERE 子句的顺序、避免使用 DISTINCT 和 ORDER BY 等。

    Oracle中分组后拼接分组字符串.pdf

    最后,我们使用 `sys_connect_by_path()` 函数来拼接分组后的数据,并使用 `start with` 子句和 `connect by` 子句来实现递归操作: ```sql select No, ltrim(max(sys_connect_by_path(Value, ';')), ';') as ...

    oracle行列转换总结

    例如,假设我们想要创建一个新的表`t_row_col`,其中每列代表原始表的一行数据,可以先使用`UNION ALL`转换行,再使用`GROUP BY`和`MAX`函数重新组合: ```sql CREATE TABLE t_row_col AS SELECT id, 'c1' cn, c1 ...

    oracle实现阶梯式累加

    SELECT NAME, DEPT, SALARY, SUM(SALARY) OVER (PARTITION BY DEPT ORDER BY NAME) TOTAL_SALARY FROM SALARY; ``` 解释一下这个查询语句: - `PARTITION BY DEPT`表示按照`DEPT`字段进行分组; - `ORDER BY NAME`...

    Oracle SQL最佳实践

    在合并多个查询结果时,我们通常会使用 `UNION` 或 `UNION ALL`。其中 `UNION` 会在返回结果前进行排序并去除重复记录,这可能会消耗大量的计算资源。相比之下,`UNION ALL` 不会对结果进行排序或去重,因此执行效率...

    Oracle行转列

    可以使用UNION ALL、MODEL和COLLECTION等方法来实现列转行。 使用UNION ALL方法,例如: ```sql SELECT id, 'c1' cn, c1 cv FROM t_col_row UNION ALL SELECT id, 'c2' cn, c2 cv FROM t_col_row UNION ALL SELECT ...

    Oracle高效SQL语句原则

    在使用 Order by 语句时,如果排序的列不是索引列,或者有计算表达式,可能会导致查询速度下降。 7. 如果要使用 NOT,则应在取反的短语前面加上括号,并在短语前面加上 NOT 运算符 在使用 NOT 运算符时,应该在...

    oracle运维必要宝典

    ### Oracle运维必要宝典 #### Oracle运维基础知识概览 Oracle数据库是全球领先的数据库管理系统之一,在企业级应用领域占据举足轻重的...通过深入理解和掌握这些内容,可以有效提升Oracle数据库系统的稳定性和性能。

    Oracle性能问题总结

    * 避免使用耗费资源的操作:带有 DISTINCT,UNION,MINUS,INTERSECT,ORDERBY 的 SQL 语句会启动 SQL 引擎,执行耗费资源的排序(SORT)功能 表设计和其他 * 建立数据库表时要尽量避免不必要的冗余项,但是为了提高...

    oracle行列转换

    这种操作可以使用 UNION ALL 语句、MODEL 子句和 COLLECTION 语句来实现。 1. 使用 UNION ALL 语句 UNION ALL 语句可以将多个 SELECT 语句的结果合并成一个结果集。 示例代码: ```sql SELECT * FROM T_COL_ROW;...

    oracle 面试题目及解答

    - `UNION ALL`用于合并多条`SELECT`语句的结果集,并包含所有记录(包括重复记录)。 ### 2. 数据聚合查询 **题目描述:** 查询表`A`中的所有列,同时从表`B`中获取`content`对应的`ismember`的总和,并按`content...

    Oracle存储过程编写及调优

    在编写SQL语句时,应避免使用复杂多表关联、游标操作,以及像UNION、MINUS、DISTINCT、ORDER BY、GROUP BY和HAVING等可能导致临时表创建的操作。可以尝试用更高效的替代方法,如将UNION替换为UNION ALL,将HAVING...

Global site tag (gtag.js) - Google Analytics