【发布时间】:2021-06-27 17:52:16
【问题描述】:
我有两个来自两个不同系统的数据集在 SQL 中合并在一起,但是,这两个系统的命名约定略有不同。约定的变化在较大的数据样本中并不一致,但通常需要进行一次修改才能匹配。
| System 1 data | System 2 data |
|---|---|
| AA0330 | AA_330 |
| AA0340 | AA_340 |
| AA0331 | AA_331 |
| AA0341 | AA-341 |
我一直在使用下面的 Levenshtein 距离 SQL 函数太模糊匹配并得到下面的结果,但是,最终得到了重复的连接。我该如何修改我的代码来缓解这种情况?
SELECT [System1].[mvmt1],
[System2].[mvmt2]
FROM [System1]
left join [System2]
ON dbo.ufn_levenshtein([System1].[mvmt1], [System2].[mvmt2]) < 2;
http://www.artfulsoftware.com/infotree/qrytip.php?id=552&m=0
当前输出:
| System 1 data | System 2 data |
|---|---|
| AA0330 | AA_330 |
| AA0330 | AA_340 |
| AA0340 | AA_340 |
| AA0331 | AA_331 |
| AA0341 | AA-341 |
如何确保我只能从加入中获得一个结果?
【问题讨论】:
-
然后看函数,在select中包含函数看看返回什么
-
该函数只是将 levenshtein 关系作为 int 返回。然后我在我的左连接中使用它。如何让左连接只返回类似于 vlookup 的第一个匹配项?
-
即使使用左连接,您也可以根据 func 的结果匹配表 a 和 b,因此表 a 中 AA0330 与表 b 中 (AA_330, AA_340) 之间的 Levenshtein 距离小于 2 和这就是为什么你在那里有 2 个结果
-
谢谢,我是否可以在同一个查询中清理表以只返回一个结果?几乎是系统1的一组??
-
Levenshtein 并不是真正适合这项工作的工具,正如您所发现的那样。我也无法想象它的性能非常好。更好的选择是使用(根据您的样本)前 2 个和后 3 个字符。或者您可以使用嵌套替换,直到一侧适合另一侧的格式。
标签: sql left-join ssms levenshtein-distance fuzzyjoin