基于 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 查询中最接近的文本匹配连接表?的主要内容,如果未能解决你的问题,请参考以下文章

基于最近时间戳连接两个表的 SQL 查询

在 SQL 连接语句中选择一对多关系中最匹配的记录

SQL多表连接抛出骗子

SQL连接查询

连接两个表并从一列返回多个匹配项的 SQL 查询?

SQL JOIN 查询返回我们在连接表中没有找到匹配项的行