基于 SQL 查询中最接近的文本匹配连接表?
Posted
技术标签:
【中文标题】基于 SQL 查询中最接近的文本匹配连接表?【英文标题】:Join tables based on closest text match in SQL queries? 【发布时间】:2016-08-10 21:44:03 【问题描述】:我正在使用 Microsoft Access。我对 SQL 还是很陌生(对不起,如果我目前的方法看起来太简单了),我一直在尝试加入两个具有不同列名的表,其中一个表具有完整的打印机型号名称,而其他表只是打印机型号名称的一部分。
这是一些示例数据
表A:型号 MS811DN 激光打印机 MS811DTN激光打印机 MS812激光打印机
表B: 型号 MS811DTN MS811DN MS81(其中MS81之后的任何东西都可以代表除了MS811DTN或MS811DN之外的任何东西)
我尝试在 FROM 语句中使用以下内容: 从 表A 左连接表 B ON TableA.Model LIKE TableB.Model&'*'
但这会返回重复的结果,因为它提供了模型“喜欢”的所有值
我要做的是返回提供最接近匹配的结果,例如 表 A 表 B MS811DN 激光打印机链接到 MS811DN MS811DTN 激光打印机链接到 MS811DTN MS812 激光打印机链接到 MS81
有没有办法只返回最接近匹配的结果?
【问题讨论】:
表 A 是否太大而无法配备可由表 B 中键对应的值填充(可能通过某种算法,然后手动调整)的列?通过这种方式,您可以将最接近的匹配(有时在我看来像是在猜测)转换为完全匹配。 我在表 A 中有超过 30,000 个字段需要匹配(不确定这是否被认为太大),但您的意思是在拉动表之前为表 A 配备另一列到表中询问?如果是这样,我想避免这一步,因为我正在为其他人编写此查询,以便在他们提取报告时复制和粘贴。如果这不是你的意思,你能详细说明吗? 【参考方案1】:原来的选择很好。正如你提到的
select ...
FROM TableA
LEFT JOIN Table B ON TableA.Model LIKE TableB.Model&'*'
然后我们可以引入相似值计算字段。
LEN(TableB.Model) - LEN(TableA.Model)
如果它是 0,我们发现完全匹配。
那你需要添加
GROUP BY TableA.Model
并为每个模型找到一个 MIN(相似度)。
然后只留下相似度最小的记录。
select *
FROM TableA INNER JOIN
(select TableA.Model, MIN(LEN(TableB.Model) - LEN(TableA.Model)) as minSim
FROM TableA
LEFT JOIN Table B ON TableA.Model LIKE TableB.Model&'*'
GROUP BY TableA.Model) sub ON TableA.Model=sub.Model
LEFT JOIN TableB on TableA.Model LIKE TableB.Model&'*'
and sub.minSim=LEN(TableB.Model) - LEN(TableA.Model)
我不熟悉 Access,所以语法可能是错误的。只是为了展示这个想法
【讨论】:
您好,感谢您的快速响应!我尝试使用您的建议,但由于某种原因,最后一行“and sub.minSim=LEN(TableB.Model) - LEN(TableA.Model)”不允许它运行。不断弹出“不支持 JOIN 表达式”的错误消息,当我取出该语句时,它再次起作用。知道可以做些什么来解决这个问题吗? sub.minSim=(LEN(TableB.Model) - LEN(TableA.Model)) 括号呢?我不是 MS Access 方面的专家,无法提供准确的语法。您需要存储相似度并仅保留距离最小的相似度 与其他 sql 平台相比,Microsoft Access 的语法很难看。括号似乎也不起作用,但是当我将最后一行放在 WHERE 语句末尾时,它起作用了。是否有理由认为这是一个糟糕的选择? 我会说将条件移动到 WHERE 部分很好。当 TableB 没有合适的模型时,也尝试使用 NULL以上是关于基于 SQL 查询中最接近的文本匹配连接表?的主要内容,如果未能解决你的问题,请参考以下文章