Я пытаюсь выполнить нечеткое сопоставление строк, чтобы получить как можно больше совпадений. Сначала я выполняю алгоритм расстояния Левенштейна (http://www.kodyaz.com/articles/fuzzy-string-matching-using-levenshtein-distance-sql-server.aspx) и сохраняю его как «расстояние» в моем dbo.
Моя первая таблица (t1) выглядит так:
Name | Synonym
A | A1
A | A2
A | A3
B | B1
B | B2
Моя вторая таблица (t2) выглядит так: Поле ID может очень сильно выглядеть как Имя и Синоним
ID | Description
A | XXX
B | YYY
Моя цель состоит в том, чтобы сделать левые соединения либо для имени, либо для его синонимов, когда расстояние между двумя строками из каждой таблицы (t1 и t2) меньше 2.
Вот моя текущая работа:
SELECT *
FROM (
SELECT t2.ID, ROW_NUMBER() over (partition by ID order by ID) as rn
FROM table1 as t1
LEFT JOIN table2 as t2
ON (upper(trim(t1.Name)) = upper(trim(t2.ID)) OR upper(trim(t1.Synonym)) = upper(trim(t2.ID)))
WHERE (dbo.distance(t1.Name,t2.ID)<=2 OR dbo.distance(t1.Synonym,t2.ID)<=2)
) temp
WHERE rn=1
В идеале, если расстояние между ними меньше 2, мы по-прежнему будем выполнять соединение.
Он должен получить больше совпадений, добавив это условие, но его нет.
Я что-то упустил?
Мне было интересно, возникает ли моя проблема из-за этого:
Я намерен проверить, соответствуют ли условия, если да, то просто выполните соединение. Но мой код здесь, вероятно, указывает SQL «сначала присоединиться», а затем фильтровать его.
Есть ли способ позволить ему увидеть, соответствует ли условие, а затем выполнить соединение «после»? *