如何使用具有相似但不相同的名称列联接两个表?

时间:2018-11-13 16:41:48

标签: sql left-join sql-server-2014

表1

SchoolId_1   Name

表2

SchoolId_2   Name

SchooldId_1SchooldId_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;

1 个答案:

答案 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