Function Access:ConcatRelated在表上工作,但不在查询上工作

Function Access:ConcatRelated在表上工作,但不在查询上工作,function,vba,ms-access,concatenation,Function,Vba,Ms Access,Concatenation,我一直在使用这个函数,虽然当数据来自表时它可以正常工作,但当数据来自查询时它就不工作了 绿色的“running query”(运行查询)栏会出现几秒钟,但当它试图显示数据时,它只显示第一行中的一个字段,运行速度非常慢,可能需要几分钟才能显示第一屏记录。我没有足够长的时间来完成结果集,必须使用任务管理器关闭Access 是否每次调用函数时都会运行查询?这可以解释为什么需要这么长时间,但似乎不太可能 这是函数、调用函数的查询还是源数据来自的查询的问题?以下是在即时窗口中使用该函数的示例 Compan

我一直在使用这个函数,虽然当数据来自表时它可以正常工作,但当数据来自查询时它就不工作了

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

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


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

以下是在即时窗口中使用该函数的示例

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

  • 创建此SQL语句

    从公司ID=7的tblOrders中选择OrderDate

  • 根据该语句打开一个
    记录集

  • 循环通过
    记录集
    将每个
    OrderDate
    值添加到其输出字符串中
  • 现在,
    ConcatRelated()
    每次调用它时都会执行相当多的工作。当您在查询中将其作为字段表达式调用时,它必须为查询结果集的每一行再次执行所有这些工作

    除了“固定开销”之外,
    ConcatRelated()
    可能会导致额外的性能成本:如果没有
    CompanyID
    上的索引,db引擎必须使用
    tblOrders
    的完整表扫描来查找满足
    WHERE
    子句的行

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

    SELECT OrderDate FROM YourQuery WHERE CompanyID  = 7
    
    除了使用表带来的
    ConCatRelated()
    带来的性能挑战之外,您还可能面临2个以上的风险,这可能会显著增加工作负载

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

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

    只是一个猜测,但可能与索引有关,或者查询中缺少索引。我们来看看这一点-它相当慢,并且使用First()要从基于五个表的5个联合查询中获取多个字段,每个查询都链接到另一个多级查询,因此可能有加快查询速度的空间。:)好的,我没有使用表,而是将它放在一个简单的select查询中,函数可以处理这个问题。因此,问题不在于查询本身的任何用途我需要使用的查询最多需要4秒钟才能返回所有结果,与其他一些查询相比,这是一个很大的问题,因此这个查询的性质是否可能会减慢@HansUp?的速度我可以尝试对其进行优化,或者可能找到一种事先将数据放入表中的方法,但这可能涉及VBA领域……是的,我认为您已经解决了:您有一个慢速查询作为
    ConCatRelated()
    的可执行选项。如果您可以加载一个暂存表以提供给
    ConCatRelated()
    ,则可以加快函数的速度。但是,接下来您必须处理加载临时表的问题。从
    ConCatRelated()。