СОЕДИНИТЕ две таблицы, используя полнотекстовый поиск в SQL Server
У меня есть ситуация, когда я пытаюсь объединить две таблицы на основе частично совпадающих текстовых данных. Я прочитал вопрос " Использование полнотекстового поиска в SQL Server 2005 по нескольким таблицам и столбцам", и мне кажется, что лучше всего создать VIEW
и добавить полнотекстовый индекс на VIEW
,
Позвольте мне начать с краткого описания ситуации. У меня есть таблица Excel, которая мне нужна для расчета цены на лекарства, но названия лекарств в таблице не соответствуют точно той базе данных, в которую я собираю информацию о ценах. Таким образом, я решил, что использование полнотекстового поиска может быть лучшим способом.
То, что я сделал до сих пор, экспортирует электронную таблицу в виде файла CSV и использует BULK INSERT
импортировать данные в мою базу данных. Теперь моя база данных лекарств имеет первичный ключ NDC
, но эта информация не доступна в электронной таблице, к сожалению, или моя работа будет намного проще.
Мне нужно в основном соответствовать 'AMLODIPINE TAB 5MG'
а также 'AMLODIPINE BESYLATE 5MG TAB'
, Это только один пример, но другие препараты похожи. Моя проблема в том, что я даже не уверен, как я смогу создать VIEW
чтобы добавить оба столбца, без их соответствия.
Есть ли способ использовать полнотекстовый поиск в JOIN
Скажите, что-то вроде:
SELECT i.Description, m.ProdDescAbbr
FROM dbo.ImportTable i
LEFT JOIN dbo.ManufNames m ON m.ProdDescAbbr <something similar to> i.Description
РЕДАКТИРОВАТЬ:
Не все названия лекарств будут содержать дополнительные слова, еще один пример, который я пытаюсь найти: 'ACYCLOVIR TAB 800MG'
А ТАКЖЕ 'ACYCLOVIR 800MG TAB'
2 ответа
В своей работе я увидел эту (причудливую для меня) функцию CONTAINSTABLE
, который использует полнотекстовый индекс. Может быть, очень сложная функция для этой ситуации, но я хотел бы поделиться.
Returns a table of zero, one, or more rows for those columns containing precise or fuzzy (less precise) matches to single words and phrases, the proximity of words within a certain distance of one another, or weighted matches
В целом, я вижу, что вам нужно подготовить условие поиска (сделать его текстовым), прежде чем искать его.
Пример:
SELECT select_list
FROM table AS FT_TBL
INNER JOIN CONTAINSTABLE(table, column, contains_search_condition) AS KEY_TBL
ON FT_TBL.unique_key_column = KEY_TBL.[KEY];
источник http://msdn.microsoft.com/en-us/library/ms189760.aspx
Вы можете добавить
CREATE VIEW view_name WITH SCHEMABINDING
AS
перед вашим SQL, чтобы создать представление. Тогда вы могли бы
CREATE UNIQUE CLUSTERED INDEX idx_name
ON view_name(Description, ProdDescAbbr)
Тогда ты можешь
CREATE FULLTEXT INDEX ON view_name
Это позволит вам запустить поиск с
WHERE CONTAINS( (Description, ProdDescAbbr), 'search_term')