从三个相关表

时间:2016-08-03 20:03:01

标签: database access-vba ms-access-2010

我在Access 2010过滤记录中遇到问题,这些记录符合三个可能的表格中的条件,这些表格都由一个公共FormulationID链接。

简化说明

  • 我有一个名为tblFormulation的表,其中包含FormulationID键和描述创建者的字段,一般特征,制定日期等。我将需要过滤其中的一些字段。我将展示的大多数字段都在此表中。

  • 通过FormulationID链接的是第二个表tblComponents,其中包含所有组件,其类型和卷。每个FormulationID有4-7个组件。我想按组件和/或类型选择FormulationsIDs。我只需要知道哪个FormulationIDs符合标准。我没有显示任何这些字段。

  • 还通过FormulationID链接了第三个名为tblApprovals的表。让我们将此视为Authorites,他们已针对这些配方发布了不同的批准级别。我想再次通过审批和/或FormulationsIDs选择Authorites。每个Forumulation可以有1到30个批准。我只需要知道哪个FormulationIDs符合标准。我没有显示任何这些字段。组件和批准的编辑在选择配方后调用的单独表格上进行。

我尝试了两种方法来生成配方列表和一般特征,其中包含具有特定选定批准的选定组件。

  • 首先,我创建了每条腿的标准查询。我们称他们为qryComponentsqryApprovals。这些都会生成针对条件筛选的FormulationIDs列表。由于' Ambiguous Outer Joins' 问题,访问权限不允许我在tblFormulation的最终查询中加入这些内容,因此我最终创建了一个中间查询qryStep2,仅在tblFormulation中找到qryApprovals条记录。然后,我在qryFiltered的最终查询tblFormulation中加入qryComponents记录。 然后,我使用qryFiltered作为recordsournce的{​​{1}},其中包含frmFilteredtblFormulations以及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。我想我可以单步执行并删除重复。听起来不对。

所以我被卡住了。我会继续玩,但可以真正使用一些帮助。

3 个答案:

答案 0 :(得分:1)

重新:访问不会让我只是在最终查询中使用tblFormulation加入这些因为“模糊的外部联接”

尝试使用tblFormulationqryComponents的左外连接,使用tblFormulation的所有行和tblFormulationqryApprovals的第二个左外连接,包含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”));

我还学会了发布代码 - 它使它更加清晰。第一个问题。谢谢大家