Условные присоединения на сервере SQL - как сделать SQL сначала, чтобы проверить, выполняются ли условия, а затем выполнить СОЕДИНЕНИЕ после - PullRequest
0 голосов
/ 05 мая 2020

Я пытаюсь выполнить нечеткое сопоставление строк, чтобы получить как можно больше совпадений. Сначала я выполняю алгоритм расстояния Левенштейна (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 «сначала присоединиться», а затем фильтровать его.

Есть ли способ позволить ему увидеть, соответствует ли условие, а затем выполнить соединение «после»? *

1 Ответ

0 голосов
/ 05 мая 2020

Я пробовал функцию DIFFERENCE только для демонстрационных целей. Он определяет, похожи ли две строки, затем возвращает 4 (наименьшее возможное различие) и опускается до 0 (наименьшее возможное различие). Вы можете попробовать аналогичный logi c, используя функцию расстояния.

DECLARE @table1 TABLE(Name varchar(10), synon varchar(10))

DECLARE @table2 TABLE(Name varchar(10), synon varchar(10))

INSERT INTO @table1
VALUES ('A','A1'),('A','A2'),('A','A3'),('B','B1'),('B','B2'),('B','B3')

INSERT INTO @table2
VALUES ('A','A1'),('A','A2'),('C','C1'),('B','B2'),('B','B3')


SELECT t1.name, t1.synon, t2.Name,t2.synon
FROM @table1 as t1
CROSS APPLY (SELECT T2.Name, t2.synon FROM @table2 as t2 WHERE DIFFERENCE(t2.Name,t1.Name) = 4 OR DIFFERENCE(t2.synon,t1.synon) = 4) as t2
+------+-------+------+-------+
| name | synon | Name | synon |
+------+-------+------+-------+
| A    | A1    | A    | A1    |
| A    | A2    | A    | A1    |
| A    | A3    | A    | A1    |
| A    | A1    | A    | A2    |
| A    | A2    | A    | A2    |
| A    | A3    | A    | A2    |
| B    | B1    | B    | B2    |
| B    | B2    | B    | B2    |
| B    | B3    | B    | B2    |
| B    | B1    | B    | B3    |
| B    | B2    | B    | B3    |
| B    | B3    | B    | B3    |
+------+-------+------+-------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...