2013-07-13 84 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-在這種情況下,您的分隔符將是空白區域,這與字符串拼接相反 - 如何將字符串拆分爲多個字符串。 –

+0

嗨,我沒有找到我需要的匹配,因爲如果我理解正確,他們分割一個字符串,而不是從表到另一個行。 – Patrick

回答

4

的一種方法是使用遞歸CTE:

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; 

使用相同的結構,你可以用insert替換最終select

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

這是假設您已將id設置爲標識列。

這是第一個查詢的SQLFiddle

編輯:

我認爲最終的查詢會是這樣的:

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

嗨,謝謝。我有困難去適應你的解決方案的關鍵字和KeywordSearches表,你能幫助嗎?我無法找到將解決方案應用於關鍵字表格中所有行的方法。 – Patrick

+0

只需在'with'子句中刪除'keywords'的定義即可。我把它放在那裏只是爲了測試目的。 –

+0

不好意思問,但你提到的什麼改變適應了它? – Patrick

相關問題