【问题标题】:Access: ConcatRelated works on a table, but not on a query访问:ConcatRelated 适用于表,但不适用于查询
【发布时间】:2012-12-13 14:48:20
【问题描述】:

我一直在使用Allen Browne's ConcatRelated函数,虽然当数据来自表时它工作正常,但当数据来自查询时它不起作用。

绿色的“正在运行的查询”栏会出现几秒钟,但是当它尝试显示数据时,它只显示第一行中的一个字段,运行速度非常慢,可能需要几分钟才能显示第一个屏幕记录。我没有设法让它足够长的时间来完成结果集,必须使用任务管理器关闭 Access。

每次调用函数时都会运行查询吗?这可以解释为什么需要这么长时间但似乎不太可能。

这是函数、调用函数的查询还是源数据来自的查询的问题?

【问题讨论】:

  • 只是一个猜测,但它可能与索引有关,或者您的查询中没有索引。
  • 将看看这个 - 它相当慢,它使用 First() 从 5 个联合查询中获取多个字段,这些查询基于五个表并且每个都链接到另一个多级别查询,因此可能有加快速度的空间。 :)

标签: function vba ms-access concatenation


【解决方案1】:

这是在立即窗口中使用该功能的示例。

CompanyID = 7
? ConcatRelated("OrderDate", "tblOrders", "CompanyID = " & CompanyID)
12/11/2012, 12/12/2012, 12/13/2012

函数...

  1. 创建此 SQL 语句

    SELECT OrderDate FROM tblOrders WHERE CompanyID = 7

  2. 根据该语句打开Recordset

  3. 循环遍历Recordset,将每个OrderDate 值添加到其输出字符串中

IOW,ConcatRelated() 每次调用它时都会执行相当多的工作。当您在查询中将其作为字段表达式调用时,它必须为查询结果集的每一行再次执行所有这些工作。

除了“固定开销”之外,ConcatRelated() 可能会导致额外的性能成本:如果CompanyID 上没有索引,数据库引擎将不得不使用tblOrders 的全表扫描来查找行满足WHERE 子句。

您的问题询问使用查询而不是带有ConcatRelated() 的表的影响。那么函数的内部 SQL 语句将是:

SELECT OrderDate FROM YourQuery WHERE CompanyID  = 7

除了ConCatRelated() 对表格带来的性能挑战之外,您还面临另外 2 个风险,这可能会显着增加工作量。

  1. 如果 YourQuery 需要 db 引擎付出大量努力,它必须付出努力来创建父查询结果集的每一行。
  2. 您增加了 db 引擎无法为函数内部 SQL 语句中的 WHERE 子句使用索引的可能性。即使YourQuery 的基础表源中的CompanyID 上有索引,db 引擎也可能看不到使用它的足够好处。

所以虽然ConCatRelated() 很有用,但使用它的成本很高。这不是因为函数中的任何设计错误。相反,无论您使用什么方法来完成任务,任务的性质都是如此昂贵。并且要求该函数使用查询而不是表可能会增加成本。

【讨论】:

  • 好吧,我没有使用表,而是将它放在一个简单的选择查询中,该函数可以处理这个问题。所以问题不在于查询本身的任何使用。 ~ 我需要使用的查询最多可能需要 4 秒才能返回所有结果,这与其他一些查询相比是很多的,所以这个查询的性质可能会减慢@HansUp 的速度吗? 〜我可以尝试优化它,或者可能找到一种方法将数据预先放入表中,但这可能涉及VBA的世界......
  • 是的,我想你已经成功了:你有一个慢查询作为ConCatRelated()strTable 选项。如果您可以加载暂存表以提供给ConCatRelated(),则可以加快该功能。但是你必须处理加载暂存表。从ConCatRelated() 做你想做的事没有便宜/简单的访问解决方案。
猜你喜欢
  • 2011-05-20
  • 2020-04-13
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多