2013-07-13 2 views
1

Мне нужно создать запрос, который берет строки из таблицы и вставляет в связанную таблицу все разделенные строки.Создание связанных записей на основе строки в SQL Server

Пример:

В таблице Keywords У меня есть строка:

Id Name 
1 RENAULT CLIO MTV 

И мне нужно создать запрос, который принимает строку и создать 1 строку для каждого слова, как это:

В таблице KeywordSearches:

Id: (Identity Increment) 
Name: RENAULT 
Keyword_Id: 1 

Id: (Identity Increment) 
Name: CLIO 
Keyword_Id: 1 

Id: (Identity Increment) 
Name: MTV 
Keyword_Id: 1 

I должны быть в состоянии создать все связанные Поиск по ключевым словам на основе каждой строки таблицы Ключевые слова.

Спасибо.

+1

Вы пробовали поиск на сайте Http: //stackoverflow.com/questions/314824/t-sql- напротив-строка-конкатенация-как-split-string-into-multiple-reco, в этом случае ваш разделитель будет белым. –

+0

Привет, я не нахожу соответствия для того, что мне нужно, потому что, если я правильно понимаю, они разбивают строку, а не строки из таблицы в другую. – Patrick

ответ

4

Один из способов получить список ключевых слов, чтобы использовать рекурсивный КТР:

with keywords as (
     select 1 as id, 'RENAULT CLIO MTV' as keywords union all 
     select 2 as id, 'A B' as keywords 
    ), 
    cte as (
     select id, 
      (case when keywords like '% %' 
        then left(keywords, charindex(' ', keywords)) 
        else keywords 
       end) as keyword, 
      (case when keywords like '% %' 
        then substring(keywords, charindex(' ', keywords)+1, 1000) 
        else '' 
       end) as rest 
     from keywords 
     union all 
     select id, 
      (case when rest like '% %' 
        then left(rest, charindex(' ', rest)) 
        else rest 
       end) as keyword, 
      (case when rest like '% %' 
        then substring(rest, charindex(' ', rest)+1, 1000) 
        else '' 
       end) as rest 
     from cte 
     where len(rest) > 0 
    ) 
select id, keyword 
from cte; 

Используя ту же структуру, вы можете заменить окончательный select с insert:

insert into KeywordSearches(name, keyword_id) 
    select keyword, id 
    from CTE; 

Это предполагает что вы установили id в качестве столбца идентификации.

Вот первый вопрос: SQLFiddle.

EDIT:

Я думаю, что окончательный запрос будет что-то вроде:

with cte as (
     select id, 
      (case when keywords like '% %' 
        then left(keywords, charindex(' ', keywords)) 
        else keywords 
       end) as keyword, 
      (case when keywords like '% %' 
        then substring(keywords, charindex(' ', keywords)+1, 1000) 
        else '' 
       end) as rest 
     from keywords 
     union all 
     select id, 
      (case when rest like '% %' 
        then left(rest, charindex(' ', rest)) 
        else rest 
       end) as keyword, 
      (case when rest like '% %' 
        then substring(rest, charindex(' ', rest)+1, 1000) 
        else '' 
       end) as rest 
     from cte 
     where len(rest) > 0 
    ) 
insert into KeywordSearches(name, keyword_id) 
    select keyword, id 
    from CTE; 
+0

Привет, спасибо. У меня есть трудности, чтобы адаптировать ваше решение к таблицам «Ключевые слова и ключевые слова», можете ли вы помочь в этом? Я не могу найти способ применить ваше решение ко всем строкам в таблице «Ключевые слова». – Patrick

+0

Просто оставьте определение 'keywords' в предложении' with'. Я поставил его только для тестирования. –

+0

Извините, что спросила, но какие изменения вы ссылаетесь на ее адаптацию? – Patrick

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