MS SQL - объединение двух таблиц с ключом в одной колонке - PullRequest
2 голосов
/ 09 июня 2011

У меня есть 2 таблицы, к которым мне нужно присоединиться, однако в одной из таблиц мне нужно извлечь ключ из поля varchar в каждой строке.

Таблица 1 Описание (номер 18, varchar 4000)

    descriptionid   description 
    1               Blah Blah: Queue 1Blah Blah
    2               foobar:Queue 2
    3               rem:Queue 2 -This is a note
    4               Anotherrow: Queue 3
    5               Something else

Таблица 2 Очередь - (число 18, varchar 100)

    queueid queue

    123     Queue 1
    124     Queue 2
    127     Queue 3
    129     Queue 4

Так что мне нужно произвести вывод примерно так

Просмотр 3-описание очереди (цифра 18, цифра 18)

    descriptionid   queueid
    1               123
    2               124
    3               124
    4               127
    5               null

Итак, в строке 1 таблицы 1 мне нужно вычеркнуть значение Queue1 из описания, убедиться, что оно находится в таблице очередей, и найти queueid.

Я не могу изменить структуру таблиц 1 и 2.

Какими способами этого можно достичь в MSSQL?

Какой самый эффективный способ сделать это в SQL - используя MSSQL 2005 здесь.

Ответы [ 3 ]

2 голосов
/ 09 июня 2011

самый эффективный способ

Ну ... не знаю об этом, но это способ.

select T1.descriptionid,
       T2.queueid
from Table1 as T1
  left outer join Table2 as T2
    on T1.description like '%'+T2.queue+'%'

Другой способ

select T1.descriptionid,
       T2.queueid
from Table1 as T1
  left outer join Table2 as T2
    on charindex(T2.queue, T1.description, 1) > 0

Если найдено более одного совпадения (см. Комментарий Эда Харпера), вы можете использовать его для выбора совпадения с самым длинным совпадением.

select T1.descriptionid,
       T2.queueid
from Table1 as T1
  outer apply ( 
                 select top 1 T3.queueid
                 from Table2 as T3
                 where charindex(T3.queue, T1.description, 1) > 0
                 order by len(T3.queue) desc
              ) as  T2(queueid)
1 голос
/ 09 июня 2011

Самый эффективный способ сделать это - добавить дополнительный столбец в вашу таблицу и вставить извлеченный идентификатор из строки. Вы можете сделать это, когда строки добавлены, и вы можете обрабатывать существующие довольно легко. Но попытка присоединиться к ней будет очень медленной.

0 голосов
/ 09 июня 2011

В Sql Server 2005 вы можете извлечь строку очереди с помощью регулярных выражений. Раздел Извлечение данных на этой странице содержит пример .

В хранимой процедуре вы можете затем создать индексированную временную таблицу, которая содержит новый столбец - это позволяет делать это без изменения метаданных таблицы).

Если вы можете изменить метаданные таблицы, вы можете:

Запустить содержимое в другой столбец (при вставке).

Или, если информация не нужна, немедленно ежедневное задание sql может извлечь информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...