[英]SQL - comparing strings from two tables (fuzzy match…sorta)
我已经搜索了问题并且提出了类似的问题,但没有我认为可以使用的解决方案。 这个问题类似于模糊匹配... sorta。 比较两个表我需要帮助。 一个表是公司参考表,另一个表是获取每天导入其中的原始公司数据的表。 参考表是干净的,并且具有与每个公司相关联的公司ID。 导入的每日数据没有公司ID。 我要做的是将每日数据引用到company_name上的“公司参考表”,并根据company_name更新'Company Table的列company_state。 不幸的是,每天进入的company_name的每日数据字符串并不总是相同。 在实际的公司名称前面或后面可以有各种字符(az,0-9,+, - ,。)和空格,每天都有不同的长度,所以我不相信我可以用charindex来清理它。
公司参考表
company_id company_name company_state
1 Awesome Inc NY
2 Excel-guru AL
3 Clean All MI
公司表
company_name company_state
abc123 Awesome Inc NULL
Excel gur xyz-987 NULL
Clean All Cleanall NULL
我想要它做的是这个。 Sorta就像模糊匹配一样。
公司表
company_name company_state
abc123 Awesome Inc NY
Excel gur xyz-987 AL
Clean All Cleanall MI
任何帮助深表感谢。 谢谢。
请尝试以下查询来更新公司表:
update company c INNER JOIN company_ref cr
ON c.company_name LIKE concat('%', cr.company_name, '%')
SET c.company_state = cr.company_state;
另一种方法就是使用SELECT
SELECT c.*, cr.* FROM company c INNER JOIN company_ref cr
ON c.company_name LIKE concat('%', cr.company_name, '%');
SQL小提琴: http ://sqlfiddle.com/#!2 / ec76f / 1
如果我理解,公司表中的company_name
总是包含引用表中的整个字符串 - 它可能在该字符串之前或之后包含一些垃圾。 如果是这样,您只需要为您的DBMS找到一个合适的字符串函数,它可以让您检查字符串A是否包含字符串B.例如,使用MySQL我认为以下内容将起作用(未测试):
select c.company_name, r.company_state from company_table c, reference_table r where locate(r.company_name, c.company_name) != 0
这是有效的,因为当且仅当字符串A没有出现在字符串B中时,MySQL locate(A, B)
函数返回0。
由于传入的数据格式不一致,我认为您无法使用数据库执行此操作。 事实上,我建议不要使用数据库,允许您事先运行匹配的例程。
然后,您需要检查尽可能多的数据,并查看是否可以找到任何模式,或者您可以批量处理数据以使其更容易匹配。 例如:
然后,我会建议类似于以下内容:
我希望有一段时间,你可能应该举起低可信度的比赛,让人们对他们进行评论,同时你调整你的过程。
您还可以存储公司以前的所有匹配项,这意味着随着时间的推移您的系统可能会变得更好。 这取决于每天数据的变化程度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.