我正在使用Microsoft Access。我仍然是SQL的新手(对不起,如果我当前的方法看起来太简单了),而且我一直试图加入两个具有不同列名的表,其中一个表具有完整的打印机型号名称,而其他表只有部分打印机的型号名称。
以下是一些示例数据
表A:
的模型
MS811DN激光打印机
MS811D T N LASER PRINTER
MS812激光打印机
表B:
的模型
MS811DTN
MS811DN
MS81(MS81之后的任何内容可代表除MS811DTN或MS811DN之外的任何内容)
我尝试在FROM语句中使用以下内容: 从 表A 左边加入表B. ON TableA.Model LIKE TableB.Model&'*'
但是返回重复的结果,因为它提供了模型“喜欢”的所有值
我要做的是返回提供最接近匹配的结果,例如
表A表B
MS811DN LASER PRINTER链接到MS811DN
MS811D T N LASER PRINTER链接到MS811DTN
MS812 LASER PRINTER链接到MS81
有没有办法只返回最接近匹配的结果?
答案 0 :(得分:0)
原始选择很好。正如你提到的那样
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,因此语法错误。只是为了表明这个想法