【问题标题】:Filtering unique records from a table meeting criteria in three related tables从三个相关表中满足条件的表中过滤唯一记录
【发布时间】:2016-12-09 17:01:07
【问题描述】:

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

一个简化的描述是

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

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

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

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

  • 首先,我为每条腿创建了带有条件的查询。我们称他们为qryComponentsqryApprovals。这些每个都会生成一个针对标准过滤的FormulationIDs 列表。由于 'Ambiguous Outer Joins' 问题,Access 不允许我在最终查询中使用 tblFormulation 对这些进行联接,因此我最终使用 tblFormulation 创建了一个中间查询 qryStep2仅在 qryApprovals 中找到的记录。然后,我将其与qryComponents 中的tblFormulation 记录一起加入到最终查询qryFiltered 中。 然后我使用qryFiltered 作为frmFilteredrecordsournce,其中包括tblFormulationsqryComponentsqryApprovals 中的标准组合框。 理论上这应该可行。实际上,它没有。我更改组合框并重新查询表单,但它不会重新查询底层的三个查询。我使用 VBA,但还没有弄清楚是否有办法重新查询基础查询,因此级联为我提供了最终所需的过滤公式列表。所以这个解决方案的问题是我怎样才能让 frmFiltered.cboApprovals 的 after_update 子例程强制执行四个请求 - 或者还有其他解决方案吗?

  • 在使用此解决方案失败后,我尝试了重型 VBA 方法。我创建了一个查询qryEverything,其中包含所有表中的所有字段。这为我提供了每个配方批准的 FormulationID 记录以及每个组件的另一个组合记录。有很多记录。然后我使用组合框和我想要的字段的子表单设置frmFilter。组合框上的更新后事件触发对qryEverything SQL 语句的 WHERE 子句的修改,我将其用于 subForm 的记录集。这可行,但我重复了 FormulationID,其中单个配方同时满足组件和批准腿的标准。我以为我可以在过滤之后使用SELECT UNIQUE on FormulationID,但它在WHERE 子句之前,所以过滤不起作用。我真的需要能够在这个记录集上做第二个SELECT UNIQUE。我想我可以通过它并删除重复。听起来不对。

所以我被困住了。我会继续玩,但真的需要一些帮助。

【问题讨论】:

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


    【解决方案1】:

    re:Access 不会让我在最终查询中使用 tblFormulation 对这些进行连接,因为“外连接不明确”

    尝试使用从tblFormulationqryComponents 的左外连接,使用tblFormulation 中的所有行,然后再次使用从tblFormulationqryApprovals 的第二个左外连接,使用tblFormulation 中的所有行。

    这应该就是你所需要的。如果您只想要包含至少一个组件并获得批准的配方,请使用内连接而不是外连接。

    如果仍有问题,请发布您的 SQL。

    【讨论】:

    • 我觉得这个可以,我试试看。我认为这将解决四个查询问题,但我不会仍然以三个查询(qryComponents、qryFormulations 和新的 qryFiltered)结束吗?当组合框修改 qryComponents 或 qryFormulations 中的条件时,对 frmFiltered 的重新查询仍将仅重新查询 qryFiltered,而不是基础 qryComponents 和 qryFormulations。这种嵌套查询解决方案的最大问题是让早期查询使用新标准进行更新,以便最终查询显示符合标准的公式。也许我错过了什么
    • 你试过了吗?它应该刷新您正在显示的查询,包括其所有基础查询。
    【解决方案2】:

    听起来真正的挑战在于构建 WHERE 子句

    我认为作为一个查询,这会起作用

    dim strsql1 = _
    "SELECT tblformulation.*, tblcomponents.FormulationID, tblcomponents.FormulationID  FROM tblformulation AS a JOIN tblcomponents as B ON  a.FormulationID = b.FormulationID JOIN tblComponents as c ON a.FormulationID = c.FormulationID WHERE " & strwhere & ";")
    

    然后从那里选择 Distinct a.FormulationID,瞧

    【讨论】:

      【解决方案3】:

      在帮助下,我找到了答案并学到了一些东西。虽然我说我只需要来自 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"));

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-23
        • 1970-01-01
        • 1970-01-01
        • 2020-09-03
        • 1970-01-01
        相关资源
        最近更新 更多