Во-первых, нечеткий поиск немного расплывчатый. Существует ряд алгоритмов, которые используются для нечеткого сопоставления, включая расстояние Левенштейна, самую длинную общую подпоследовательность и некоторые другие, на которые есть ссылки в разделе «См. Также» этой страницы Википедии о приближенном сопоставлении строк .
Перефразируя то, что вы пытаетесь сделать. Вы обновляете столбец UNDERWRITER_CODE
в MainTbl
с помощью UNDERWRITER_CODE
, который соответствует наиболее похожим UNDERWRITER_NAME
в LKP
. Нечеткие алгоритмы могут быть использованы для измерения сходства . Обратите внимание на мой пост здесь . Для предоставленных вами образцов данных мы можем использовать функции T- SQL Левенштейна Фила Фактора и сопоставлять их на основе наименьшего значения Левенштейна, например:
SELECT TOP (1) WITH TIES
UNDERWRITER_CODE_NULL = m.UNDERWRITER_CODE,
LKP_UN = m.UNDERWRITER_NAME, l.UNDERWRITER_NAME, l.UNDERWRITER_CODE,
MinLev = dbo.LEVENSHTEIN(m.UNDERWRITER_NAME, l.UNDERWRITER_NAME)
FROM dbo.MainTbl AS m
CROSS JOIN dbo.LKP AS l
WHERE m.UNDERWRITER_CODE IS NULL
ORDER BY ROW_NUMBER() OVER (PARTITION BY m.UNDERWRITER_NAME
ORDER BY dbo.LEVENSHTEIN(m.UNDERWRITER_NAME, l.UNDERWRITER_NAME))
Возвращает:
UNDERWRITER_CODE_NULL LKP_UN UNDERWRITER_NAME UNDERWRITER_CODE MinLev
--------------------- ------------------ ------------------ ---------------- -----------
NULL dylan.campbell Dylan Campbell 2 1
NULL dylanadmin Dylan Campbell 2 8
NULL dylanc Dylan Campbell 2 8
NULL scott.noffsinger Scott Noffsinger 1 1
Мы можем использовать эту логику c для обновления UNDERWRITE_CODE
следующим образом:
WITH FuzzyCompare AS
(
SELECT TOP (1) WITH TIES
UNDERWRITER_CODE_NULL = m.UNDERWRITER_CODE,
LKP_UN = m.UNDERWRITER_NAME, l.UNDERWRITER_NAME, l.UNDERWRITER_CODE,
MinLev = dbo.LEVENSHTEIN(m.UNDERWRITER_NAME, l.UNDERWRITER_NAME)
FROM dbo.MainTbl AS m
CROSS JOIN dbo.LKP AS l
WHERE m.UNDERWRITER_CODE IS NULL
ORDER BY ROW_NUMBER() OVER (PARTITION BY m.UNDERWRITER_NAME
ORDER BY dbo.LEVENSHTEIN(m.UNDERWRITER_NAME, l.UNDERWRITER_NAME))
)
UPDATE fc
SET fc.UNDERWRITER_CODE_NULL = fc.UNDERWRITER_CODE
FROM FuzzyCompare AS fc
JOIN dbo.MainTbl AS m ON fc.UNDERWRITER_NAME = m.UNDERWRITER_NAME;
После этого обновления SELECT * FROM dbo.mainTbl
Возвращает:
UNDERWRITER_CODE UNDERWRITER_NAME
---------------- -------------------
2 dylan.campbell
2 dylanadmin
2 dylanc
2 Dylan Campbell
2 dylan.campbell
2 dylanadmin
1 scott.noffsinger
1 Scott Noffsinger
Это должно заставить вас начать ; в зависимости от количества и вида данных, с которыми вы имеете дело, вам нужно будет очень избирательно выбирать используемые вами алгоритмы. Выполняйте домашнее задание и тестируйте, тестируйте, тестируйте!
Дайте мне знать, если у вас есть вопросы.