Как объединить 2 таблицы, используя столбец имен с похожими, но не одинаковыми? - PullRequest
0 голосов
/ 13 ноября 2018

Таблица 1

SchoolId_1   Name

Таблица 2

SchoolId_2   Name

SchooldId_1 и SchooldId_2 имеют разные значения.Имя имеет похожие, но не одинаковые значения.

В таблице 1 я получил значение столбца имени «Университет штата Мэн - Фармингтон».В таблице 2 у меня есть «Университет штата Мэн в Фармингтоне».Я хочу присоединиться к ним, но sql пропускает их, потому что они не совсем одинаковы.

Table1

Университет Стратклайда

Университет штата Мэн, Форт Кент

Брин Атин Колледж Новой Церкви

Общественный колледж Адирондак

Общественный колледж Аллена

Общественный колледж Новой Шотландии

Колледж единства

Колледж Аллена

Table2

Университет Стратклайда - Глазго

Университет штата Мэн в Форт-Кенте

Колледж Брин Атин

Колледж единства

Allen 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

Я пробовал LIKE, CHARINDEX, но они требуют, чтобы столбцы имени имели точноте же значения.

Текущий код (но возвращает только те же самые значения имени):

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 голосов
/ 13 ноября 2018

Фантастический вопрос! У меня постоянно возникает эта проблема благодаря пользовательским данным в текстовых полях произвольной формы.

Мое решение состояло в том, чтобы создать UDF для использования Python, чтобы это исправить. Мой 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 может быть недоступен. В этом случае вы можете попытаться соединить что-то похожее в UDF на основе SQL.

1012 * например *

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
...