Access多表关联查询优化:仅显示对应服务物料的质保日期
Access查询:仅显示特定服务关联的物料质保日期
表结构说明
- Servis(服务表):存储服务信息,其中
Datum(服务日期)用于计算物料质保到期日 - Material(物料表):存储物料信息,
Garancija为物料的质保时长 - Servis_Material(服务-物料关联表):记录服务与所用物料的对应关系,通过
ServisID和MaterialID关联两张主表
需求
创建Access查询,仅显示指定服务实际使用的物料对应的质保到期日(计算公式:服务日期Datum + 物料质保时长Garancija),而非所有服务的关联记录。
当前使用的SQL
SELECT DISTINCT Servis.Datum+Material.Garancija AS garancijski_rok, Servis.Datum, Material.Ime, Servis_Material.ServisID FROM Servis INNER JOIN (Material INNER JOIN Servis_Material ON Material.MaterialID = Servis_Material.MaterialID) ON Servis.ServisID = Servis_Material.ServisID WHERE (((Servis_Material.ServisID)=[Servis].[ServisID]) AND ((Servis_Material.materialid)=[material].[materialid])) ORDER BY Servis_Material.ServisID;
注:字段对应关系:Datum=服务日期、Garancija=质保时长、Ime=物料名称
问题分析
当前查询返回所有服务的物料记录,原因是WHERE子句中的两个条件是冗余验证:表已经通过INNER JOIN完成关联,Servis_Material.ServisID=[Servis].[ServisID]和Servis_Material.materialid=[material].[materialid]不会过滤任何数据,相当于对关联后的所有记录做“自我确认”。
修正方案
方案1:固定查询某一服务
如果需要查询特定服务(比如ServisID=1),直接在WHERE子句中指定服务ID:
SELECT Servis.Datum + Material.Garancija AS garancijski_rok, Servis.Datum, Material.Ime, Servis_Material.ServisID FROM Servis INNER JOIN (Material INNER JOIN Servis_Material ON Material.MaterialID = Servis_Material.MaterialID) ON Servis.ServisID = Servis_Material.ServisID WHERE Servis_Material.ServisID = 1 -- 替换为目标服务ID ORDER BY Servis_Material.ServisID;
方案2:参数查询(灵活交互)
如果需要每次查询时手动输入服务ID,用参数查询,Access会自动弹出输入提示框:
SELECT Servis.Datum + Material.Garancija AS garancijski_rok, Servis.Datum, Material.Ime, Servis_Material.ServisID FROM Servis INNER JOIN (Material INNER JOIN Servis_Material ON Material.MaterialID = Servis_Material.MaterialID) ON Servis.ServisID = Servis_Material.ServisID WHERE Servis_Material.ServisID = [请输入服务ID:] -- 输入提示文字可自定义 ORDER BY Servis_Material.ServisID;
额外优化
- 若
Servis_Material表中没有重复的ServisID+MaterialID记录,可去掉DISTINCT,避免不必要的性能消耗 - 可将字段别名改为中文,比如把
garancijski_rok改为质保到期日期,更直观
内容的提问来源于stack exchange,提问作者matevz nero
相关产品推荐
相关产品推荐

