表1
SchoolId_1 Name
表2
SchoolId_2 Name
SchooldId_1
和SchooldId_2
具有不同的值。名称具有相似但不相同的值。
在表1中,我得到了名称栏值“缅因大学-法明顿大学”。在表2中,我有“缅因大学法明顿分校”。我想加入这些,但是sql跳过了它们,因为它们并不完全相同。
表1
斯特拉斯克莱德大学
缅因州肯特大学(University of Maine Fort Kent)
Bryn Athyn新教会学院
阿迪朗达克社区学院
艾伦社区学院
新斯科舍省社区学院
团结学院
艾伦学院
表2
斯特拉斯克莱德大学-格拉斯哥
缅因州肯特堡大学
Bryn Athyn College
团结学院
艾伦学院
我想使用具有上述值的名称列将它们加入,结果将类似于
SchoolId_1 Name SchoolId_2
1 University of Strathclyde 1101
2 University of Maine Fort Kent 1102
3 Bryn Athyn College of the New Church 1103
4 Adirondack Community College NULL
5 Allen Community College NULL
6 Nova Scotia Community College NULL
7 Unity College 1104
8 Allen College 1105
我尝试了CHARINDEX之类的方法,但是它们要求Name列具有完全相同的值。
当前代码(但仅返回完全相同的名称值):
SELECT
dsa.SchoolId_1, dsa.Name, ds.SchoolId_2, ds.sch_address, ds.city, ds.sch_state
INTO
match_sch
FROM
dbo.sa_schools dsa
LEFT JOIN
dbo.school ds ON dsa.Name = ds.Name;
答案 0 :(得分:1)
奇妙的问题!由于用户在自由格式文本字段上生成的数据,我一直遇到这个问题。
我的解决方案是构建一个使用python来解决此问题的UDF。我的UDF使用python,尤其是fuzzywuzzy library。我传入两个字符串,它返回一个可用于过滤的数字分数。
例如
SELECT
t1.schoolid_1
,t2.schoolid_2
,t1.name as name_1
,t2.name as name_2
FROM
table_1 t1
LEFT JOIN
table_2 t2
ON
my_udf(t1.name, t2.name) > 70
尽管看起来您正在SQL Server上运行,所以python可能不可用。在这种情况下,您可以尝试在基于SQL的UDF中进行类似的操作。
例如
SELECT
1.0 * a.matches / a.rows as match_score
FROM
(SELECT
count(1) as rows
,count(CASE WHEN t1 is not NULL and t2 is not NULL THEN 1 END) as matches
FROM
(SELECT value FROM string_split(t1.name, '1')
) t1
FULL OUTER JOIN
(SELECT value FROM string_split(t2.name, '1')
) t2
ON
t1.value = t2.value
) a