在编写查询语句的时候,经常会遇到跨多个表查询数据的情况,我目前在给人用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
从表结构上来优化吧,第一期期末现金、第二期期末材料余额、第二期所得税 等等数据应该单独存表
一下说到点上了,我也觉得我的表设计的不是那么合理,所以才会造成SQL语句这么难看。因为第一期期末现金、第二期期末材料余额、第二期所得税 之类的都是某一个相关窗体产生的最终结果,我目前是选择在相应窗体关闭的时候把 第一期期末现金 之类的结果插入到 一个结算结果表中,上述代码中的 a, 也就是tblCompanyStages就带有这种性质的一个表。但是其他表里的相关字段会依赖这些计算结果字段,因而在关闭的时候存储计算结果会涉及到好几个表,所以要同时更新其他表字段,才能保证依赖这些计算结果字段的窗体的数据正确显示呈现给用户,这样在每次关闭窗体时势必会涉及到比较大面积的数据更新,进而会影响窗体关闭的速度,影响用户体验。那有没有更好地办法来解决依赖计算结果字段的字段的同步更新呢??
@weegoood:
数据的同步可以使用 触发器 存储过程,可惜Access并不支持。
这样你的窗体计算的实现,就要分步执行,当一个计算结果完成后,将结果写入Access数据表,然后进行下一步的计算。可以设计一个表或者字段来保存计算数据的状态,进行到哪一步了,确保数据的一致性。
@acepro: 恩目前我基本上是这么做的,程序也不是很大,就将就用着,没人回结贴了,谢了
建议用临时表细化,现在看着就头痛
Access经不起这样的复杂语句啊,Access本来就慢
的确是,明显力不从心