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