根据 SQL 查询中最接近的文本匹配加入表格?
Join tables based on closest text match in SQL queries?
我正在使用 Microsoft Access。我对 SQL 还是很陌生(抱歉,如果我目前的方法看起来太简单了),我一直在尝试连接两个具有不同列名的 table,其中一个 table 具有完整的打印机型号名称,而另一个 table 仅具有打印机型号名称的一部分。
这是一些样本数据
Table答:
型号
MS811DN 激光打印机
MS811DTN 激光打印机
MS812 激光打印机
TableB:
型号
MS811DTN
MS811DN
MS81(其中MS81之后的任何东西都可以代表除MS811DTN或MS811DN之外的任何东西)
我试过在 FROM 语句中使用以下内容:
从
Table一个
左连接 Table B
在 TableA.Model 喜欢 TableB.Model&'*'
但是 return 重复的结果,因为它提供了模型 "like"
的所有值
我想要做的是 return 提供最接近匹配的结果,这样
TableATableB
MS811DN 激光打印机链接到 MS811DN
MS811DTN 激光打印机链接到 MS811DTN
MS812 激光打印机链接到 MS81
有没有办法只得到 return 个最接近匹配的结果?
原来的select就可以了。正如你所说
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,所以语法可能有误。只是为了展示这个想法
我正在使用 Microsoft Access。我对 SQL 还是很陌生(抱歉,如果我目前的方法看起来太简单了),我一直在尝试连接两个具有不同列名的 table,其中一个 table 具有完整的打印机型号名称,而另一个 table 仅具有打印机型号名称的一部分。
这是一些样本数据
Table答:
型号
MS811DN 激光打印机
MS811DTN 激光打印机
MS812 激光打印机
TableB:
型号
MS811DTN
MS811DN
MS81(其中MS81之后的任何东西都可以代表除MS811DTN或MS811DN之外的任何东西)
我试过在 FROM 语句中使用以下内容: 从 Table一个 左连接 Table B 在 TableA.Model 喜欢 TableB.Model&'*'
但是 return 重复的结果,因为它提供了模型 "like"
的所有值我想要做的是 return 提供最接近匹配的结果,这样
TableATableB
MS811DN 激光打印机链接到 MS811DN
MS811DTN 激光打印机链接到 MS811DTN
MS812 激光打印机链接到 MS81
有没有办法只得到 return 个最接近匹配的结果?
原来的select就可以了。正如你所说
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,所以语法可能有误。只是为了展示这个想法