我一直在使用Allen Browne 的 ConcatRelated函数,虽然当数据来自表时它工作正常,但当数据来自查询时它不起作用。
绿色的“正在运行的查询”栏会出现几秒钟,但是当它尝试显示数据时,它只显示第一行中的一个字段,运行速度非常慢,可能需要几分钟才能显示第一屏记录。我没有设法让它足够长的时间来完成结果集,必须使用任务管理器关闭 Access。
每次调用函数时都会运行查询吗?这可以解释为什么需要这么长时间但似乎不太可能。
这是函数的问题,是调用函数的查询,还是源数据来自的查询?
我一直在使用Allen Browne 的 ConcatRelated函数,虽然当数据来自表时它工作正常,但当数据来自查询时它不起作用。
绿色的“正在运行的查询”栏会出现几秒钟,但是当它尝试显示数据时,它只显示第一行中的一个字段,运行速度非常慢,可能需要几分钟才能显示第一屏记录。我没有设法让它足够长的时间来完成结果集,必须使用任务管理器关闭 Access。
每次调用函数时都会运行查询吗?这可以解释为什么需要这么长时间但似乎不太可能。
这是函数的问题,是调用函数的查询,还是源数据来自的查询?
这是在立即窗口中使用该功能的示例。
CompanyID = 7
? ConcatRelated("OrderDate", "tblOrders", "CompanyID = " & CompanyID)
12/11/2012, 12/12/2012, 12/13/2012
功能 ...
创建此 SQL 语句
从 tblOrders 中选择 OrderDate,其中 CompanyID = 7
Recordset
根据该语句打开一个
Recordset
将每个OrderDate
值添加到其输出字符串IOW,ConcatRelated()
每次调用它时都会执行相当多的工作。当您在查询中将其作为字段表达式调用时,它必须为查询结果集的每一行再次执行所有这些工作。
除了“固定开销”之外,ConcatRelated()
可能会导致额外的性能成本:如果没有索引 on CompanyID
,数据库引擎将不得不使用全表扫描tblOrders
来查找满足该WHERE
子句的行。
您的问题询问使用查询而不是带有ConcatRelated()
. 那么函数的内部 SQL 语句将是:
SELECT OrderDate FROM YourQuery WHERE CompanyID = 7
除了ConCatRelated()
使用表带来的性能挑战之外,您还面临 2 个以上的风险,这可能会显着增加工作量。
YourQuery
db 引擎需要付出很多努力,它必须付出努力来创建父查询结果集的每一行。WHERE
函数内部 SQL 语句中的子句使用索引的可能性。即使CompanyID
在 的基础表源中有索引YourQuery
,数据库引擎也可能看不到使用它的足够好处。因此,虽然ConCatRelated()
有用,但使用它是昂贵的。这不是因为函数中的任何设计错误。相反,无论您使用什么方法来完成任务,任务的性质都是如此昂贵。并且要求该函数使用查询而不是表可能会增加成本。