基于SQL查询中最接近的文本匹配来连接表?

时间:2016-08-10 21:44:03

标签: sql ms-access join match closest

我正在使用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

有没有办法只返回最接近匹配的结果?

1 个答案:

答案 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,因此语法错误。只是为了表明这个想法