表C 结构
cid cdate cvalue ctype
1 2007-11-8 8:40:36 21 0
2 2007-10-8 8:40:36 0 1
3 2007-9-8 8:40:36 13 0
4 2007-8-8 8:40:36 21 0
5 2007-7-8 8:40:36 55 0
6 2007-6-8 8:40:36 3 0
7 2007-5-8 8:40:36 2 0
8 2007-4-8 8:40:36 0 0
9 2007-3-8 8:40:36 0 0
10 2007-2-8 8:40:36 21 1比如查询2月到11月的数据,并把时间在3个月前且cvalue是0的数据排除
需要得到的结构如下:
1 2007-11-8 8:40:36 21 0
3 2007-9-8 8:40:36 13 0
4 2007-8-8 8:40:36 21 0
5 2007-7-8 8:40:36 55 0
6 2007-6-8 8:40:36 3 0
7 2007-5-8 8:40:36 2 0
我写的sql如:
select cid,cdate,cvalue from C
where ctype=0 and NOT (cvalue = 0 AND TO_CHAR (ADD_MONTHS (SYSDATE + 1,-3),'yyyymmdd') >TO_CHAR (cdate,'yyyymmdd'));写这个例子可能不是很完整,我只是想把NOT改掉,
这样写效率不高,请问这个语句要怎么优化一下呢?
cid cdate cvalue ctype
1 2007-11-8 8:40:36 21 0
2 2007-10-8 8:40:36 0 1
3 2007-9-8 8:40:36 13 0
4 2007-8-8 8:40:36 21 0
5 2007-7-8 8:40:36 55 0
6 2007-6-8 8:40:36 3 0
7 2007-5-8 8:40:36 2 0
8 2007-4-8 8:40:36 0 0
9 2007-3-8 8:40:36 0 0
10 2007-2-8 8:40:36 21 1比如查询2月到11月的数据,并把时间在3个月前且cvalue是0的数据排除
需要得到的结构如下:
1 2007-11-8 8:40:36 21 0
3 2007-9-8 8:40:36 13 0
4 2007-8-8 8:40:36 21 0
5 2007-7-8 8:40:36 55 0
6 2007-6-8 8:40:36 3 0
7 2007-5-8 8:40:36 2 0
我写的sql如:
select cid,cdate,cvalue from C
where ctype=0 and NOT (cvalue = 0 AND TO_CHAR (ADD_MONTHS (SYSDATE + 1,-3),'yyyymmdd') >TO_CHAR (cdate,'yyyymmdd'));写这个例子可能不是很完整,我只是想把NOT改掉,
这样写效率不高,请问这个语句要怎么优化一下呢?
解决方案 »
- Centos5.4装9204快要疯了,哥被伤了,以后Linux要好好恶补才行
- 两个数据库之间的连接 视图更新
- Oracle10g下创建表空间的问题
- RMAN做热备时的错误ORA-17627
- commit work 与 commit work release的区别
- 新手求教同一数据库下的导出,导入不成功
- 小弟是个初学者,想用sqlload导入,但死活不会用,诚心聆听你的教诲!
- 从oracle9i客户段登陆oracle9i服务器[用sys登陆,但不知道口令]....大家进来看看!!
- 在oracle8.17里编一个触发器
- 请问:如何修改Oracle的字符集,谢谢了?
- em的登陆
- 唉!!怎么就安装不上oracle呢!!
where ctype=0 and ((cvalue<>0 AND cdate<trunc(ADD_MONTHS(SYSDATE,-3), 'yyyymmdd ')) or cdate>=trunc(ADD_MONTHS(SYSDATE,-3), 'yyyymmdd '));
我总觉得用ctype来搜索本来效率就不会高 ,因为ctype应该不可能为索引(重复性太高)
select cid,cdate,cvalue from C
where ctype=0 and ((cvalue<>0 AND cdate<trunc(ADD_MONTHS(SYSDATE,-3)) or cdate>=trunc(ADD_MONTHS(SYSDATE,-3)));
from C
where TO_CHAR(ADD_MONTHS(SYSDATE+1,-3), 'yyyymmdd ')< TO_CHAR(cdate, 'yyyymmdd ')
and (TO_CHAR(ADD_MONTHS(SYSDATE+1,-3), 'yyyymmdd ')>TO_CHAR(cdate, 'yyyymmdd ') and cvalue <> 0)
and TO_CHAR(cdate, 'yyyymmdd ') between '20070201' and '20071130'(给楼主提供个思路而已,没有测试)