CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Oracle >  开发

如何提高效率

楼主shazi_pig(傻子)2005-12-09 13:24:30 在 Oracle / 开发 提问

现在有两张没有任何关系的表,appointment表   和   consult表;  
  两个表都有字段:id,title,time   ,organiname   (id,一个是varchar2类型,一个是number类型)  
  现在需要:   (1)约会和征友在一个页面的表格内根据时间顺序显示。  
                      (2)每条记录增加字段,用来区别是date记录还是consult记录。  
                        (3)     因为页面显示的原因,要对查询分页。  
  例如:     id,             title,           time,                 name         type  
                1011           heheheh         2005/11/23         aa             date  
                2011           fsdfs             2005/10/10           bb           date  
                1023           fasfasf         2005/05/01           cc           consult  
   
  SELECT   *   FROM   (SELECT   TO_CHAR(ID)   AS   ID,ORGANIGER   AS   ORG,TITLE,TIME,ORGANINAME   AS   NAME    
   
  ,'DATE'   AS   TYPE   FROM   APPOINTMENT    
  UNION    
  ALL     SELECT   ID   AS   ID,ORGANIGER   AS   ORG,   TITLE,PUBLISHTIME   AS   TIME,ORGANINAME   AS   NAME,'CONSULT'   AS   TYPE   FROM   CONSULT   ORDER   BY   TIME   DESC)     WHERE   ROWNUM   <30    
  MINUS  
  SELECT   *   FROM   (SELECT   TO_CHAR(ID)   AS   ID,ORGANIGER   AS    
   
  ORG,TITLE,TIME,ORGANINAME   AS   NAME   ,'DATE'   AS   TYPE   FROM   APPOINTMENT  
  UNION   ALL    
  SELECT   ID   AS   ID,ORGANIGER   AS   ORG,   TITLE,PUBLISHTIME   AS   TIME,ORGANINAME   AS   NAME,'CONSULT'   AS   TYPE   FROM   CONSULT   ORDER   BY   TIME   DESC)       where   rownum   <   20  
  现在是我写的查询语句,但我一直担心效率问题,请各位帮忙看下,怎么提高,或者哪里写的不恰当,同时时间的排序是混乱的。 问题点数:100、回复次数:7Top

1 楼shazi_pig(傻子)回复于 2005-12-09 14:27:13 得分 0

有没有在?大家帮我看看??  
  Top

2 楼waterfirer(水清)回复于 2005-12-09 15:13:21 得分 60

不用minus  
  换成  
  select   *   from   (SELECT   a.*,rownum   t   FROM   (SELECT   TO_CHAR(ID)   AS   ID,ORGANIGER   AS   ORG,TITLE,TIME,ORGANINAME   AS   NAME,'DATE'   AS   TYPE   FROM   APPOINTMENT   UNION   ALL   SELECT   ID   AS   ID,ORGANIGER   AS   ORG,   TITLE,PUBLISHTIME   AS   TIME,ORGANINAME   AS   NAME,'CONSULT'   AS   TYPE   FROM   CONSULT   ORDER   BY   TIME   DESC)   a   WHERE   ROWNUM   <30)   where   t>=20Top

3 楼ronny5(兔子林)回复于 2005-12-09 15:15:32 得分 40

我感觉你这么做还不如两个表都拿出前20条,然后union一下再取前20条Top

4 楼shazi_pig(傻子)回复于 2005-12-09 16:03:29 得分 0

waterfirer(水清):为什么不可以用minus,以及用rownum的between   and   这些效率那个高些?Top

5 楼shazi_pig(傻子)回复于 2005-12-09 16:13:30 得分 0

SELECT   *   FROM   (SELECT   ID,ORG,TITLE,TIME,ROWNUM   AS   T   ,NAME   FROM   (SELECT   TO_CHAR(ID)   AS   ID,ORGANIGER   AS   ORG,TITLE,TIME,ORGANINAME   AS   NAME    
   
  ,'DATE'   AS   TYPE   FROM   APPOINTMENT    
  UNION   ALL     SELECT   ID   AS   ID,ORGANIGER   AS   ORG,   TITLE,PUBLISHTIME   AS   TIME,ORGANINAME   AS   NAME,'CONSULT'   AS   TYPE   FROM   CONSULT   ORDER   BY   TIME   DESC)     WHERE   ROWNUM   <30   )WHERE   T>20;  
  这个我测试了,用的时间是0.015,我上面的方法用的时间是0.062,却是提高了很多。大家还有没有更好的方法。Top

6 楼shazi_pig(傻子)回复于 2005-12-09 16:22:13 得分 0

兔子林的方法好是好,关键时间很容易错误,约会和征友两个表的时间相差很大,按照你的方法时间是0.009,但结果不正确。呵呵。Top

7 楼waterfirer(水清)回复于 2005-12-09 17:20:23 得分 0

单个表取中间记录的方法是用rowid和rownum,如下。在这里并不适用。  
  Select   *   from   tab   where   rowid   in   (SELECT   r   FROM   (SELECT   m.rowid   r,   rownum   t   FROM     (SELECT   a.rowid   FROM   tab   a   order   by   col1   desc)   m   WHERE   rownum   <   30)   WHERE   t   >=   10)   order   by   col1   desc;Top

相关问题

  • 如何提高效率?##################
  • 如何提高Socket服务器效率?
  • 如何提高系统效率
  • 讨论:如何提高开发效率?
  • 如何提高TTreeView使用效率?
  • !!!如何提高效率和速度?
  • hibernate小问题:如何提高效率
  • 如何提高数据库操作的效率?
  • 高手请如——谁知道如何提高CListBox的效率?
  • 一个人工作时,如何提高工作效率????

关键词

  • date
  • consult
  • rownum
  • 表
  • appointment
  • rowid
  • 记录
  • 方法
  • desc
  • organiger as org

得分解答快速导航

  • 帖主:shazi_pig
  • waterfirer
  • ronny5

相关链接

  • Oracle类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo