首页 新闻 会员 周边

复杂SQL语句的优化

0
悬赏园豆:50 [已解决问题] 解决于 2012-10-27 11:40

  在编写查询语句的时候,经常会遇到跨多个表查询数据的情况,我目前在给人用ACCESS写一个小程序,但是,我总感觉自己写的查询语句不够合理,各位能帮忙看一下吗,看看怎样修改一下效率更高,更符合SQL查询的逻辑。先谢过了。

SELECT IIf(Forms!控制面板!cboStage<>1,IIf(Forms!控制面板!cboStage=2,h.第一期期末现金,k.第二期期末现金),d.QMXJ) AS 期初现金,
a.SaleIncome, a.OtherIncome, a.OtherCost, ((b.PreDeposit+a.BQCK)*b.DepositRate) AS 存款利息, a.AddLoan, a.Withdrawals,
a.BQCLCGF, c.SJ, c.JS, c.GC, c.WL, c.SC, c.ZJL, b.AddLoanRate, b.CXFXS AS 促销费系数, b.YSFXS AS 产品运输费系数, b.GCFXS,
(b.CNYSFXS*(IIf(Forms!控制面板!cboStage<>1,IIf(Forms!控制面板!cboStage=2,n.第一期期末材料余额,p.第二期期末材料余额),d.QMCLYE)+a.BQCLCGF-a.QMCLYE)) AS 厂内运输费,
(b.CKBGF*a.QMCLYE) AS 仓库保管费, d.SaleIncome AS 期初销售收入, e.第一期销售收入, f.第二期销售收入, a.DeliveryAmount,
IIF(Forms!控制面板!cboStage<>1,20,5) AS 研究开发费, a.InfoCost, a.AllFines,
((b.PreLoan*b.PreLoanRate)+(a.AddLoan*b.AddLoanRate)) AS 借款利息, a.ReturnLoan, a.BQCK,
IIf(Forms!控制面板!cboStage<>1,IIf(Forms!控制面板!cboStage=2,r.第一期所得税,s.第二期所得税),d.Tax) AS 上期所得税
FROM
(SELECT * FROM tblCompanyStages WHERE CompanyID=Forms!控制面板!cboCompany And StageNo=Forms!控制面板!cboStage)  AS a,
(SELECT * FROM tblTrains WHERE TrainID=Forms!控制面板!txtTrainID)  AS b,
(SELECT * FROM tblCompanys WHERE CompanyID=Forms!控制面板!cboCompany)  AS c,
tblInitialReports AS d,
(SELECT SaleIncome AS 第一期销售收入 FROM tblCompanyStages WHERE CompanyID=Forms!控制面板!cboCompany And StageNo=1)  AS e,
(SELECT SaleIncome AS 第二期销售收入 FROM tblCompanyStages WHERE CompanyID=Forms!控制面板!cboCompany And StageNo=2)  AS f,
(SELECT QMXJ AS 第一期期末现金 FROM tblCompanyStages WHERE CompanyID=Forms!控制面板!cboCompany And StageNo=1)  AS h,
(SELECT QMXJ AS 第二期期末现金 FROM tblCompanyStages WHERE CompanyID=Forms!控制面板!cboCompany And StageNo=2)  AS k,
(SELECT QMCLYE AS 第一期期末材料余额 FROM tblCompanyStages WHERE CompanyID=Forms!控制面板!cboCompany And StageNo=1)  AS n,
(SELECT QMCLYE AS 第二期期末材料余额 FROM tblCompanyStages WHERE CompanyID=Forms!控制面板!cboCompany And StageNo=2)  AS p,
(SELECT Tax AS 第一期所得税 FROM tblCompanyStages WHERE CompanyID=Forms!控制面板!cboCompany And StageNo=1)  AS r,
(SELECT Tax AS 第二期所得税 FROM tblCompanyStages WHERE CompanyID=Forms!控制面板!cboCompany And StageNo=2)  AS s

weegoood的主页 weegoood | 初学一级 | 园豆:5
提问于:2012-10-16 15:55
< >
分享
最佳答案
0

从表结构上来优化吧,第一期期末现金、第二期期末材料余额、第二期所得税 等等数据应该单独存表

收获园豆:50
acepro | 小虾三级 |园豆:1218 | 2012-10-16 17:34

一下说到点上了,我也觉得我的表设计的不是那么合理,所以才会造成SQL语句这么难看。因为第一期期末现金、第二期期末材料余额、第二期所得税   之类的都是某一个相关窗体产生的最终结果,我目前是选择在相应窗体关闭的时候把 第一期期末现金 之类的结果插入到 一个结算结果表中,上述代码中的 a, 也就是tblCompanyStages就带有这种性质的一个表。但是其他表里的相关字段会依赖这些计算结果字段,因而在关闭的时候存储计算结果会涉及到好几个表,所以要同时更新其他表字段,才能保证依赖这些计算结果字段的窗体的数据正确显示呈现给用户,这样在每次关闭窗体时势必会涉及到比较大面积的数据更新,进而会影响窗体关闭的速度,影响用户体验。那有没有更好地办法来解决依赖计算结果字段的字段的同步更新呢??

weegoood | 园豆:5 (初学一级) | 2012-10-16 21:33

@weegoood: 

数据的同步可以使用 触发器  存储过程,可惜Access并不支持。
这样你的窗体计算的实现,就要分步执行,当一个计算结果完成后,将结果写入Access数据表,然后进行下一步的计算。可以设计一个表或者字段来保存计算数据的状态,进行到哪一步了,确保数据的一致性。

acepro | 园豆:1218 (小虾三级) | 2012-10-19 09:06

@acepro: 恩目前我基本上是这么做的,程序也不是很大,就将就用着,没人回结贴了,谢了

weegoood | 园豆:5 (初学一级) | 2012-10-27 11:39
其他回答(2)
0

建议用临时表细化,现在看着就头痛

田林九村 | 园豆:2367 (老鸟四级) | 2012-10-16 16:17
0

Access经不起这样的复杂语句啊,Access本来就慢

jason2013 | 园豆:1998 (小虾三级) | 2012-10-16 16:49

的确是,明显力不从心

支持(0) 反对(0) weegoood | 园豆:5 (初学一级) | 2012-10-16 21:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册