日期:2014-05-18  浏览次数:20380 次

请帮忙优化以下以下的查询语句
以下的查询语句,目的是查询出所有的单位名称等项目,其中要求单位名称不重复,并要求是以bgdid倒序排列,我的sql语句如下,虽然能实现,但查询时间太长,因此请教优化方式:


SELECT top 10 单位名称,单位地址,电话.电话号码 as 单位电话,传真.电话号码 as 单位传真,手机.电话号码 as 单位手机,邮政编码,Email,QS,产品名称,样品等级,商标,型号规格,标准号 from 
((((((((((((报告单 
inner join 单位名称 on 报告单.scdwmcid=单位名称.dwmcid) 
inner join 单位地址 on 单位地址.dwdzid=报告单.scdwdzid) 
inner join 电话号码 as 电话 on 电话.dhhmid=报告单.scdwdhid) 
inner join 电话号码 as 传真 on 传真.dhhmid=报告单.scdwczid) 
inner join 电话号码 as 手机 on 手机.dhhmid=报告单.scdwsjid) 
inner join 邮政编码 on 邮政编码.yzbmid=报告单.scdwybid) 
inner join Email on Email.Emailid=报告单.scdwemailid) 
inner join QS on QS.QSid=报告单.qsid) 
inner join 产品名称 on 产品名称.cpmcid=报告单.cpmcid) 
inner join 样品等级 on 样品等级.ypdjid=报告单.ypdjid) 
inner join 商标 on 商标.sbid=报告单.sbid) 
inner join 型号规格 on 型号规格.xhggid=报告单.xhggid) 
inner join 标准号 on 标准号.bzhid=报告单.cpbzid
  and bgdid in (select top 10 max(bgdid) as maxbgdid from 报告单 inner join 单位名称 on 报告单.scdwmcid=单位名称.dwmcid where dbo.GetHeadPy(单位名称) like '%cd%' or 单位名称 like '%cd%' group by 单位名称) order by bgdid desc

------解决方案--------------------
dbo.GetHeadPy(单位名称) like '%cd%' or 单位名称 like '%cd%'
这句可以改成
charindex('cd',dbo.GetHeadPy(单位名称)+','+单位名称)>0 -- 其中的逗号是防止“dbo.GetHeadPy(单位名称)”的最后一个字符和“单位名称”的第一字符组合起来刚好等于cd

------解决方案--------------------
SQL code

SELECT top 10 单位名称,单位地址
  from 报告单 
 inner join 单位名称 
    on 报告单.scdwmcid=单位名称.dwmcid
 where 
 bgdid in (select top 10 max(bgdid) as maxbgdid 
         from 报告单 
        inner join 单位名称 on 报告单.scdwmcid=单位名称.dwmcid 
        where dbo.GetHeadPy(单位名称) like '%cd%' 
           or 单位名称 like '%cd%'  --本处可改为union all
        group by 单位名称)
 order by bgdid desc