求教sql语句(100分)

  • 主题发起人 主题发起人 lmk
  • 开始时间 开始时间
L

lmk

Unregistered / Unconfirmed
GUEST, unregistred user!
oracle数据库,表名为readmeter双主键分别为CustID,OughtReadDate;表中有字段feesum,每个用户每月记录最多只有一条。<br>现在需要查询2008年2月份的feesum,本条记录最近的一条记录的feesum(没有就为0),去年同期的(即2007-2)feesum,麻烦高手们帮帮忙
 
这个是我自己写的一条sql语句,对错还不知道,但运行效率太差,条件中的officecode,custid,oughtreaddate都为索引,数据库中有将近8000W条记录。<br>select distinct a.custid,a.oughtreaddate,a.watersum,a.prevmeterdata,a.meterdata,b.watersum,c.watersum<br>from readmeter a <br>left join (<br>&nbsp; select CustID,oughtreaddate,watersum from readmeter where (custid,oughtreaddate) in<br>&nbsp; (select CustID,max(oughtreadDate) &nbsp;<br>&nbsp; from Readmeter where officecode='02' and oughtreaddate &lt;'01-9月-06' <br>&nbsp; and custid in (select custid from readmeter where officecode='02' and oughtreaddate between '01-9月-06' and '30-9月-06'<br>and viewtype='6')<br>&nbsp; group by custid)) b on a.custid=b.custid<br>left join (<br>&nbsp; select custid,oughtreaddate,watersum from readmeter where custid in<br>&nbsp; (select custid from readmeter where officecode='02' and oughtreaddate between '01-9月-05' and '30-9月-05' <br>&nbsp; &nbsp;and custid in (select custid from readmeter where officecode='02' and oughtreaddate between '01-9月-06' and '30-9月-06'<br>and viewtype='6'))<br>&nbsp; ) c on a.custid=c.custid<br>where a.officecode='02' and a.oughtreaddate between '01-9月-06' and '30-9月-06'<br>and a.viewtype='6'
 
8000W条记录,对与SQL SERVER压力已经很大,<br>而且又采用JOIN语句,<br>效率肯定低。
 
數據庫中有多少條沒關係,只要你查的不多就行,
 
to tuorx:是oracle数据库,不是sql server,多表查询,如果不用join该怎么写啊?<br><br>to Delphiguanshui:大概有几千条吧~关键是怎么写sql语句才能充分利用到索引什么的,让查询速度变的快点?
 
select a.* from a,b &nbsp;where a.id=b.id(+) &nbsp; oracle为 左连接
 
有两条需要改进的地方:<br><br>  1、最后的WHERE语句针对的都是A表,那样就把“from readmeter a ”改成“from (select * from readmeter where officecode='02' and oughtreaddate between '01-9月-06' and '30-9月-06'and viewtype='6')a”,原来的最后的WHERE语句就可以不要了,速度会快很多。<br><br>  2、如果readmeter表中有很多条记录,那就不要用“select *”了,只select具体的所用到的字段,这样也会快很多。
 
请提供oracle版本和SQL执行计划<br>估计最大的原因是oughtreaddate &lt; '01-9月-06'条件<br>建议查找上一条记录改用rank分析函数,而不是用max聚集函数查询后再连接
 
多人接受答案了。
 
后退
顶部