访问动态查询 - 更好地构建一个条件 SQL 查询或多个 VBA 查询?
Access dynamic query - Better to build one conditional SQL query or multiple queries with VBA?
我有一个 Microsoft Access 2010 表单,其中包含代表某些参数的下拉框和复选框。我需要 运行 一个基于这些参数的条件查询。为了提取所有数据,下拉框和复选框中也应该没有条件。
我有两种实现方法:
我在 WHERE
子句中使用 IIf
语句构建查询,嵌套语句直到我考虑了每个标准组合。例如,我通过使用 Forms!frmMyFrm!checkbox1
或使用函数 FormFieldValue(formName,fieldName)
来引用 SQL 逻辑中的条件,其中 returns 控件的值与表单和控件的输入名称(这是因为以前的问题)。我通过按下表单按钮将此查询设置为 运行。
我按下按钮将 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(...))
.
更复杂的内容
这有几个优点:
- SQL 已在保存的查询中编译,加快了速度。
- 不再迷失在代码中:
- 没有巨人,几乎不可能编辑查询太多
IIf
。
- 最小的 VBA 代码更容易理解。
- 至少对我这样的人来说,SQL,我可以经常为每个部分使用 MS Access 可视化查询生成器,这很方便。
我有一个 Microsoft Access 2010 表单,其中包含代表某些参数的下拉框和复选框。我需要 运行 一个基于这些参数的条件查询。为了提取所有数据,下拉框和复选框中也应该没有条件。
我有两种实现方法:
我在
WHERE
子句中使用IIf
语句构建查询,嵌套语句直到我考虑了每个标准组合。例如,我通过使用Forms!frmMyFrm!checkbox1
或使用函数FormFieldValue(formName,fieldName)
来引用 SQL 逻辑中的条件,其中 returns 控件的值与表单和控件的输入名称(这是因为以前的问题)。我通过按下表单按钮将此查询设置为 运行。我按下按钮将 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(...))
.
这有几个优点:
- SQL 已在保存的查询中编译,加快了速度。
- 不再迷失在代码中:
- 没有巨人,几乎不可能编辑查询太多
IIf
。 - 最小的 VBA 代码更容易理解。
- 没有巨人,几乎不可能编辑查询太多
- 至少对我这样的人来说,SQL,我可以经常为每个部分使用 MS Access 可视化查询生成器,这很方便。