访问动态查询 - 更好地构建一个条件 SQL 查询或多个 VBA 查询?

Access dynamic query - Better to build one conditional SQL query or multiple queries with VBA?

我有一个 Microsoft Access 2010 表单,其中包含代表某些参数的下拉框和复选框。我需要 运行 一个基于这些参数的条件查询。为了提取所有数据,下拉框和复选框中也应该没有条件。

我有两种实现方法:

  1. 我在 WHERE 子句中使用 IIf 语句构建查询,嵌套语句直到我考虑了每个标准组合。例如,我通过使用 Forms!frmMyFrm!checkbox1 或使用函数 FormFieldValue(formName,fieldName) 来引用 SQL 逻辑中的条件,其中 returns 控件的值与表单和控件的输入名称(这是因为以前的问题)。我通过按下表单按钮将此查询设置为 运行。

  2. 我按下按钮将 vba 子设置为 运行。我检查条件并根据控制条件(引用方式与前面的方法相同)将查询 SQL 设置为预先确定的 SQL 字符串。这也涉及许多 If...Else 语句,但比巨大的查询更容易阅读。

首选方法是什么?哪个更有效率?

我不相信您会发现一种方法比另一种方法更有效,至少不是很明显。在大多数情况下,这只是个人喜好。

我通常使用 VBA 并检查每个 dropdown/checkbox 的值并构建 SQL 查询的片段,然后在最后放在一起。但是,您可能 运行 使用此方法的问题是,如果您有大量下拉菜单和复选框,则代码很容易 "lost" 进入。

如果到 运行 的时间非常关键,尽管您始终可以使用一些提示 How do you test running time of VBA code? 来查看哪种方式更快。

经过大量实验,a bit of new information indicating having a pre-built query is faster than having SQL compiled in VBA,Microsoft Access 上下文中最有效且清晰 的解决方案是构建并保存多个依赖查询预先。

本质上,构建一个查询字符串,每个查询都有一个 IIf 依赖于不同的标准。那么你只需要运行最后的查询。您必须合并 VBA If...Else 的唯一情况是您需要查询比 SELECT...WHERE(IIf(...)).

更复杂的内容

这有几个优点:

  1. SQL 已在保存的查询中编译,加快了速度。
  2. 不再迷失在代码中:
    • 没有巨人,几乎不可能编辑查询太多IIf
    • 最小的 VBA 代码更容易理解。
  3. 至少对我这样的人来说,SQL,我可以经常为每个部分使用 MS Access 可视化查询生成器,这很方便。