请教Oracle中order by默认排序及工作原理

 我来答
龙氏风采
推荐于2018-04-12 · 知道合伙人互联网行家
龙氏风采
知道合伙人互联网行家
采纳数:5849 获赞数:12817
从事互联网运营推广,5年以上互联网运营推广经验,丰富的实战经

向TA提问 私信TA
展开全部
  直接看问题:
  [sql] view plain copy 在CODE上查看代码片派生到我的代码片
  select * from scott.emp p order by p.job;
  运行结果为:
  通过order by 出来的排序结果以此为:ANALYST、CLERK、MANAGER、PRESIDENT、SALESMAN...
  需求:
  现要求排序结果为MANAGER为第一个显示、CLERK为第二个显示,其他默认排序
  方法一:
  通过union all 分别查询后合并实现。
  [sql] view plain copy 在CODE上查看代码片派生到我的代码片
  select *
  from (select * from scott.emp where job in 'MANAGER' order by job)
  union all
  select *
  from (select * from scott.emp where job = 'CLERK' order by job)
  union all
  select *
  from (select * from scott.emp where job not in ('MANAGER', 'CLERK') order by job)
  运行结果为:
  备注:
  1、这里应该采用union all 进行并集,不应该使用union。因为union,会对结果集进行排序,而union all 不排序。
  2、这里的子查询中如果有order by 语句,不能直接使用union all 进行并集,会报语法错误。解决方案是将结果集作为一个新的表,查询后再并集,即可。
  方法二:
  虚拟出来一个字段,规定排序规则,依据新的排序规则进行排序即可。
  [sql] view plain copy 在CODE上查看代码片派生到我的代码片
  select
  p.*,
  case to_char(p.job)
  when 'CLERK' then '2'
  when 'MANAGER' then '1'
  else '999'
  end neworder
  from scott.emp p
  order by neworder,p.job
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式