2013-10-08 3 views
1

У меня есть таблица, которая является словарем слов, который вы можете найти в названии компании, и их синонимах. Я хочу использовать это для стандартизации имен в другой таблице. Например, «WIDGET COMPANY INCORPORATED» будет стандартизоваться «WIDGET CO INC». Я думал, что это будет так же просто, как и нижеперечисленное перекрестное соединение, но, похоже, оно работает только для первого синонима в списке, а не для всего списка. Неужели я ошибаюсь? Я собирался попытаться сделать это в SSIS вместо этого, если я не могу понять это, но я думаю, что это будет чрезмерно усложнять то, что должно быть относительно простой задачей ... конечно, я понимаю, поскольку это перекрестное соединение , мы говорим о большом количестве рядов - 50 миллионов, чтобы быть точным ...Обновление запроса с использованием перекрестного соединения

update [dbo].[Company addresses] 
set [Name 1 syn] = replace(a.[Name 1 syn], ' ' + b.[Synonym] + ' ', ' ' + b.[Base] + ' ') 
from [dbo].[Company addresses] a 
cross join dbo.Synonyms b 
+0

Да. «UPDATE» работает только один раз на целевую строку, даже если на другой стороне соединения есть много. У плана, вероятно, есть агрегат «ЛЮБОЙ», чтобы выбрать один из многих возможных. –

+0

Я не понимаю, что вы хотите сделать. Не могли бы вы предоставить некоторую структуру таблицы, образцы данных и примеры результатов. – HLGEM

+0

@HLGEM - Если '[Адрес компании] .Name'' 'улица, Лондон', и у них есть две строки синонима' street -> road' и 'London -> Big City'. Я думаю, что намерение запускать каждую замену в свою очередь, все синонимы, поэтому окончательный результат = '1 дорога, Большой город' –

ответ

1

Как о чем-то вроде:

DECLARE @RC int = 1; 

WHILE @RC > 0 
BEGIN 
    update [dbo].[Company addresses] 
    set [Name 1 syn] = replace(a.[Name 1 syn], ' ' + b.[Synonym] + ' ', ' ' + b.[Base] + ' ') 
    from [dbo].[Company addresses] a 
    inner join dbo.Synonyms b on a.[Name 1 syn] LIKE '% ' + b.[Synonym] + ' %'; 

    SET @RC = @@ROWCOUNT; 
END 
+0

Предупреждение. Чтобы избежать бесконечных циклов, вы должны убедиться, что в таблице синонимов нет циклов (например, «abc» => «abc» или оба «abc» = > 'xyz' и 'xyz' = 'abc' и т. д.) – GilM

+0

Ничего себе, отлично, спасибо! Я выяснил, как это сделать, но ваш путь намного проще и быстрее. Я не знаю, почему я не думал использовать инструкцию «LIKE» вместо того, чтобы пытаться выполнить замену на каждую комбинацию строк в обеих таблицах ... –

+0

Нет проблем. Он по-прежнему сканирует обе таблицы для каждого прохода и оценивает LIKE, но будет выполнять обновления только в строках, которые в них нуждаются. Гораздо лучше позволить SQL Server обрабатывать их как наборы, а не цикл через строки самостоятельно (если вы можете управлять им). – GilM

Смежные вопросы