我正在使用Access
的 SZENARIO
在工作中我有一个大约300k行的表,它定义了人物ID到房子ID以及相关信息(名字,姓氏,城市,“街道+街道号”,邮政编码)。每个人都可以住在n个房子里,每个房子都可以居住在那些人中。
当我被各种人访问时,我得到一张桌子。此表由人填充,因此其中没有ID,不幸的是,通常会出现拼写错误和信息缺失。它应包含“First Name”,“Last Name”,“Street& Nr”,“City”,“Postal Code”。
为了整合数据,我需要来自人的ID。为了解决拼写错误问题,我想构建一个表,它给出了按“匹配优先级”排序的结果。
填充表格被称为 tbl_to_fill ,并且获得了空的人员ID行,索引的自动编号和名字,姓氏,街道& Nr,城市和邮政编码。包含关系信息的表格称为 tbl_all 。
因此,如果我找到从tbl_to_fill到tbl_all的完全匹配(使用连接查询)“First Name”,“Last Name”和“Postal Code”或“First Name”,“Last Name”,“Street& Nr“,”城市“得到”匹配优先级“1.如果我找到与”姓氏“,”邮政编码“或”姓氏“,”城市“,”街道和Nr“的完全匹配,我得到一个“匹配优先级”2.而且还有更多级别。
然后是棘手的部分:
现在我用“tbl_to_fill”构建了一个带有调整信息的“tbl_filter”:街道号被剪切,常见的拼写错误被替换为'*'
(例如德语名称中常见的拼写错误:ph - f,就像Stefan一样在找到最后一个空格“和”之后,城市名称缩短了。
使用此表,我查找与上述相同的标准,但使用"LIKE '*' & tbl_filter.Field & '*'"
- 查询。并且它们获得与上述+ 10相同的匹配优先级。
现在,这些连接查询和Like查询都是通过联合查询聚合的,我们称之为查询 001 quni所有行。
我的工作方式与我想的完全一样,但每次运行上一次查询时都需要AGES。
我的问题
有人做过类似的事吗?我该怎么做才能加快这个过程?
由于我的许多匹配条件都要求First Name和Last Name适合,然后还有更多,我应该首先通过make table从“tbl_all”中提取匹配的行,然后运行相应的查询吗? 我应该在包含由“ - ”连接的所有信息的字段上使用正则表达式而不是类似的查询吗? 是否有更好的方法来分配这些优先事项?也许所有在一个查询中通过Iff - 函数?
Select ..., matching_priority = IFF(tbl_all."First Name" = tbl_to_Fill."FirstName",1,
IFF(...)
)
From tbl_all;
我是一名自助访问开发人员,所以我经常遇到哪些方法最优化的问题。 我经常使用VBA,不要回避它,所以如果你通过VBA获得解决方案,请告诉我。
答案 0 :(得分:0)
如果您使用模糊文本搜索,我认为您可能会稍微简化一下您的方法。这样做的常用方法是使用Levenshtein距离,或将一个字符串转换为另一个字符串所需的更改次数。 Levenshtein的一个很好的实现在这里:
通过这种方式,您可以找到最接近的城市,街道,名字,姓氏等匹配。您甚至可以设置“合理”限制,例如Levenshtein>的任何记录。 10可能是“不合理的”。我扔了10,但它会根据你的数据而有所不同。
一些优化说明:
答案 1 :(得分:0)
我在类似情况下做的一件事是提取姓氏的前几个字符,第一个名字的前一个或两个字符,以及邮政编码,并将它从两个表写入临时表,以及对截断的表执行匹配查询。在对一些要提取的字符进行修改之后,我通常可以找到速度和误判匹配之间的平衡,然后我可以对结果列表进行人工审查。速度差异可能很大 - 如果不是匹配Schermerstien,Stephan与Schermerstien,Ste * an,你匹配Scher,St to Scher,St,你可以看到加工优势。但它只有在表之间有一个小的交叉点时才有效,你可以容忍人工审查步骤。