我们如何根据接近值的条件匹配列。 这需要复杂查询/范围比较/多个连接条件。 获取查询大小超过2GB错误。
表格:
InvDetails1 / InvDetails2 / INVDL / ExpectedResult
字段关系:
InvDetails1.F1 = InDetails2.F3
InvDetails2.F5 = INVDL.F1
INVDL.DLID = ExpectedResult.DLID
ExpectedResult.Total - 1 < InvDetails1.F6 < ExpectedResult.Total + 1
left(InvDetails1.F21,10) = '2013-03-07'
返回结果,其中ExpectedResult的记录数仅为1。
Group by InvDetails1.F1 , count(ExpectedResult.DLID) works.
从这个结果。
最终结果:
InvDetails1.F1 , InvDetails1.F16 , ExpectedResult.DLID , ExpectedResult.NMR
ExpectedResult - has millions of rows.
InvDetails - few hundred thousands
答案 0 :(得分:2)
如果我遇到这种情况并且发现我的查询在2GB处“撞墙”,那么我尝试的一件事就是创建一个单独保存的选择查询以隔离InvDetails1
记录仅针对具体日期。然后,当加入其他表时,我会使用该查询而不是完整的InvDetails1
表。
我的理由是查询优化器可能无法使用您的left(InvDetails1.F21,10) = '2013-03-07'
条件在执行计划的早期排除InvDetails1
记录,这可能导致查询增长得比实际需要的大得多(内部,正在处理中)。通过将日期选择放在单独的(先决条件)查询中来强制将日期选择放到流程的开头,可以将“主”查询的大小保持在更可行的大小。
另外,如果我发现自己的问题变得那么大,我也会密切注意我的.accdb(或.mdb)文件的大小,以确保 it 不会太接近2GB。我自己从来没有遇到过这种情况,但我听说数据库文件达到了2GB的障碍可能会导致一些令人讨厌的错误并且对于恢复来说相当“具有挑战性”。