读书人

多表联表查询优化解决思路

发布时间: 2013-12-19 00:33:34 作者: rapoo

多表联表查询优化
想对此SQL进行优化,T-SQL如下:


select NEWID()
,SBI.StaffCode--座席编号
,SBI.StaffName--座席姓名
,tas.AmtSor*@SreOfTra--话务数量
,aqt.ActualScore * @SreOfQua--话务质量
,sp.PecScr * @SreOfPer--员工表现
,(tas.AmtSor * @SreOfTra + aqt.ActualScore * @SreOfQua + sp.PecScr * @SreOfPer) --汇总后总分
,convert(varchar(7),@MonthDate,20)
,GETDATE()
,@GroupNo
,(CASE WHEN (tas.AmtSor * @SreOfTra + aqt.ActualScore * @SreOfQua + sp.PecScr * @SreOfPer) >= @SceOfPas THEN '是' ELSE '否' END)
from (select * from StaffBaseInfo where AgtGrpCode = @GroupNo) SBI
left join (select StaffCode, ActualScore from AgtQuaTimes where QuaDate = convert(varchar(7),@MonthDate,20)) aqt
on SBI.StaffCode = aqt.StaffCode and (select AgtGrpCode from StaffBaseInfo sbi where sbi.StaffCode = aqt.StaffCode) = @GroupNo
left join (select StaffCode, AmtSor from TraAmtScore where TraDate= convert(varchar(7),@MonthDate,20)) tas
on SBI.StaffCode = tas.StaffCode and AgtGrpCode = @GroupNo
left join (select AgtCode, PecScr from StaffPec where convert(varchar(7),PecDate,20) = convert(varchar(7),@MonthDate,20)) sp
on SBI.DKCode = sp.AgtCode and AgtGrpCode = @GroupNo

子查询中有一个共同点就是,它们的where条件相同。所以想知道如何再对此SQL进行优化
[解决办法]
把你的代码稍微给简化了一下:

select NEWID()
,SBI.StaffCode--座席编号
,SBI.StaffName--座席姓名
,tas.AmtSor*@SreOfTra--话务数量
,aqt.ActualScore * @SreOfQua--话务质量
,sp.PecScr * @SreOfPer--员工表现
,(tas.AmtSor * @SreOfTra + aqt.ActualScore * @SreOfQua + sp.PecScr * @SreOfPer) --汇总后总分
,convert(varchar(7),@MonthDate,20)
,GETDATE()
,@GroupNo
,(CASE WHEN (tas.AmtSor * @SreOfTra + aqt.ActualScore * @SreOfQua + sp.PecScr * @SreOfPer) >= @SceOfPas THEN '是' ELSE '否' END)
from StaffBaseInfo SBI

left join AgtQuaTimes aqt
on QuaDate = convert(varchar(7),@MonthDate,20)
and SBI.StaffCode = aqt.StaffCode
--and AgtGrpCode = @GroupNo

left join TraAmtScore tas
on TraDate= convert(varchar(7),@MonthDate,20)
and SBI.StaffCode = tas.StaffCode
--and AgtGrpCode = @GroupNo

left join StaffPec sp
on convert(varchar(7),PecDate,20) = convert(varchar(7),@MonthDate,20))
and SBI.DKCode = sp.AgtCode

where sbi.AgtGrpCode = @GroupNo

[解决办法]
尽量把这些转换操作放在等号的邮编

读书人网 >SQL Server

热点推荐