我在Access 2010过滤记录中遇到问题,这些记录符合三个可能的表格中的条件,这些表格都由一个公共FormulationID
链接。
简化说明
我有一个名为tblFormulation
的表,其中包含FormulationID
键和描述创建者的字段,一般特征,制定日期等。我将需要过滤其中的一些字段。我将展示的大多数字段都在此表中。
通过FormulationID
链接的是第二个表tblComponents
,其中包含所有组件,其类型和卷。每个FormulationID
有4-7个组件。我想按组件和/或类型选择FormulationsIDs
。我只需要知道哪个FormulationIDs
符合标准。我没有显示任何这些字段。
还通过FormulationID链接了第三个名为tblApprovals
的表。让我们将此视为Authorites
,他们已针对这些配方发布了不同的批准级别。我想再次通过审批和/或FormulationsIDs
选择Authorites
。每个Forumulation
可以有1到30个批准。我只需要知道哪个FormulationIDs
符合标准。我没有显示任何这些字段。组件和批准的编辑在选择配方后调用的单独表格上进行。
我尝试了两种方法来生成配方列表和一般特征,其中包含具有特定选定批准的选定组件。
首先,我创建了每条腿的标准查询。我们称他们为qryComponents
和qryApprovals
。这些都会生成针对条件筛选的FormulationIDs
列表。由于' Ambiguous Outer Joins' 问题,访问权限不允许我在tblFormulation
的最终查询中加入这些内容,因此我最终创建了一个中间查询qryStep2,仅在tblFormulation
中找到qryApprovals
条记录。然后,我在qryFiltered
的最终查询tblFormulation
中加入qryComponents
记录。
然后,我使用qryFiltered
作为recordsournce
的{{1}},其中包含frmFiltered
和tblFormulations
以及qryComponents
中条件的组合框。 理论上这应该有效。实际上,它并没有。我改变组合框并重新查询表单,但它并没有重新查询底层的三个查询。我使用VBA并且没有想出是否有办法重新查询基础查询,因此级联为我提供了最终所需的过滤表格列表。所以关于这个解决方案的问题是如何让qryApprovals
的after_update子程序强制执行四次重新查询 - 或者是否有其他解决方案?
在使用此解决方案失败后,我尝试了重型VBA方法。我创建了一个查询frmFiltered.cboApprovals
,其中包含所有表中的所有字段。这为我提供了FormulationID记录,其中包含每个配方Approval以及每个Component的组合记录中的另一个。有很多记录。然后我使用组合框和我想要的字段的子窗体设置qryEverything
。组合框上的更新后事件触发对frmFilter
SQL语句的WHERE子句的修改,我将其用于subForm的记录集。这有效,但我重复了FormulationIDs,其中单个配方符合Component和Approval支柱的标准。我认为我可以在过滤后使用qryEverything
,但它在SELECT UNIQUE on FormulationID
子句之前,因此过滤不起作用。我真的需要能够在这个记录集上做第二个WHERE
。我想我可以单步执行并删除重复。听起来不对。
所以我被卡住了。我会继续玩,但可以真正使用一些帮助。
答案 0 :(得分:1)
重新:访问不会让我只是在最终查询中使用tblFormulation加入这些因为“模糊的外部联接”
尝试使用tblFormulation
到qryComponents
的左外连接,使用tblFormulation
的所有行和tblFormulation
到qryApprovals
的第二个左外连接,包含tblFormulation
的所有行。
这应该就是你所需要的。如果您只需要具有至少一个组件和批准的配方,请使用内部连接而不是外部连接。
如果您仍然遇到问题,请发布您的SQL。
答案 1 :(得分:0)
听起来真正的挑战是构建WHERE子句
我认为作为一个查询,这将起作用
file3:
HO840F3000336251 HOUSAM129800008 HOUSAF135774690 F 20060718 Yes
HO840F3000487279 HOUSAM131520543 HOUSAF135761935 F 20061226 Yes
HOUSAM55967108 HOUSAM53557280 HOUSAF53557285 M 20091129 Yes
然后从那里选择Distinct a.FormulationID并瞧
答案 2 :(得分:0)
在帮助下我找到答案并学到了一些东西。虽然我说我只需要来自frmFormulatins的字段,但我包括其他人才能看到结果。这创建了冗余的唯一记录。
最终查询:SELECT DISTINCT tblFormulation.FormulationID,tblFormulation.SponsorCode,tblFormulation.AddCo,tblFormulation.Application FROM tblComponent RIGHT JOIN(tblApprovals RIGHT JOIN tblFormulation ON tblApprovals.FormulationID = tblFormulation.FormulationID)ON tblComponent.FormulationID = tblFormulation.FormulationID WHERE (((tblApprovals.Authority)=“API”)AND((tblComponent.BOGrp)=“Grp III”));
我还学会了发布代码 - 它使它更加清晰。第一个问题。谢谢大家