我在使用微软Access。我对SQL还是很陌生的(如果我目前的方法看起来太简单的话,我很抱歉),我只能尝试连接两个具有不同列名的表,其中一个表有完整的打印机模型名称,而另一个表只是打印机模型名称的一部分。
以下是一些样本数据
TableA:
模型
MS811DN激光打印机
MS811DTN激光打印机
MS812激光打印机
TableB:模型
MS811DTN
MS811DN
MS81 ( MS81之后的任何内容都可以表示MS811DTN或MS811DN以外的任何内容)
在FROM语句中,我尝试使用以下方法:从TableA开始,在TableA.Model上左加入表B,如TableB.Model&'*‘
但这会返回重复的结果,因为它提供了模型“类似”的所有值。
我想要做的是返回提供最接近匹配的结果,如表A表B
MS811DN激光打印机与MS811DN的链接
MS811DTN激光打印机与MS811DTN的链接
MS812激光打印机与MS81的链接
有没有一种方法只返回最接近匹配的结果?
发布于 2016-08-10 22:02:35
最初的选择很好。就像你提到的
select ...
FROM TableA
LEFT JOIN Table B ON TableA.Model LIKE TableB.Model&'*'然后引入相似值计算场。
LEN(TableB.Model) - LEN(TableA.Model)如果是0,我们找到了完全匹配的。
那么您需要添加
GROUP BY TableA.Model并为每个模型找到一个最小(相似)的值。
然后只留下具有最小相似度的记录。
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,所以语法可能是错误的。只是为了展示这个想法
https://stackoverflow.com/questions/38884065
复制相似问题